Как я могу отправить stdout нескольким командам в fish shell?

Вопрос или проблема

Тот же вопрос, что и Как я могу отправить stdout в несколько команд?, но для оболочки fish.

На системах, где есть файлы /dev/fd/x, вы можете сделать то же самое, что и с оболочками POSIX, заменив {...;} на begin;...;end:

begin
  seq 10 3>&- | tee /dev/fd/3 | wc -c > bytes 3>&-
end 3>&1 | wc -l > lines

Здесь вывод seq 10 передается как в wc -c > bytes, так и в wc -l > lines в качестве примера.

Если командам необходимо записать что-то в оригинальный stdout, вы можете сделать его доступным через отдельный fd, как это делается в оболочках POSIX:

begin
  begin
    seq 10 3>&- | tee /dev/fd/3 | wc -c 3>&-
  end 3>&1 >&4 4>&- | wc -l 4>&-
end 4>&1

Здесь оба wc отправляют свой вывод в оригинальный stdout.

x>&- для закрытия ненужных fd является хорошей практикой, хотя и не строго необходима.

Ответ или решение

Чтобы направить стандартный вывод (stdout) в несколько команд в fish shell, можно воспользоваться механизмом перенаправления дескрипторов файлов. В fish shell вы можете использовать /dev/fd/x для этого, аналогично тому, как это делается в POSIX-совместимых оболочках.

Вот как это делается:

Пример 1: Направление вывода в две команды

Сначала давайте рассмотрим простой пример, в котором мы генерируем последовательность чисел с помощью seq и передаем вывод в две команды: wc -c для подсчета байтов и wc -l для подсчета строк.

begin
  seq 10 3>&- | tee /dev/fd/3 | wc -c > bytes 3>&-
end 3>&1 | wc -l > lines

В этом примере:

  • seq 10 генерирует последовательность от 1 до 10.
  • tee /dev/fd/3 дублирует этот вывод: одну копию передает в wc -c, а другую отправляет на файл дескриптора 3.
  • wc -c > bytes записывает количество байтов в файл bytes.
  • wc -l > lines подсчитывает количество строк и записывает это в файл lines.

Пример 2: Возвращение вывода в стандартный поток

Если вашим командам нужно записывать что-то в оригинальный стандартный вывод, вы можете сделать это, открыв отдельный дескриптор для вывода.

begin
  begin
    seq 10 3>&- | tee /dev/fd/3 | wc -c 3>&-
  end 3>&1 >&4 4>&- | wc -l 4>&-
end 4>&1

В этом примере:

  • Мы используем дополнительный дескриптор 4, чтобы вернуть вывод обратно в стандартный поток, так что обе команды wc (wc -c и wc -l) могут записывать результаты в оригинальный стандартный вывод.
  • Закрытие ненужных дескрипторов с помощью >&- является хорошей практикой, хотя и не строго обязательно.

Этот подход позволяет эффективно управлять потоком данных между несколькими командами в fish shell, сохраняя при этом возможность взаимодействия с оригинальным стандартным выводом.

Оцените материал
Добавить комментарий

Капча загружается...