Вопрос или проблема
Тот же вопрос, что и Как я могу отправить 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, сохраняя при этом возможность взаимодействия с оригинальным стандартным выводом.