]Способ, который я нашел, чтобы сделать это разумно просто использовать xargs, он берет файл / трубку и преобразует его содержимое в аргументы программы . Это можно комбинировать с tee, который разделяет поток и посылает его на две или более программ, В вашем случае вам нужно:[
] [echo filename | tee >(xargs stat) >(xargs file) | cat
]
[]В отличие от многих других ответов, это будет работать в bash и большинстве других оболочек под Linux. Я бы предположил, что это хороший вариант использования переменной, но если вы абсолютно не можете ее использовать, то это лучший способ сделать это только с помощью труб и простых утилит (предполагая, что у вас нет особенно модной оболочки командной строки).[
] []Кроме того, вы можете сделать это для любого количества программ, просто добавив их так же, как эти две после tee.[
] [][]EDIT[][
] []Как предполагается в комментариях, в этом ответе есть пара недостатков, первый из них - потенциал для вывода чересстрочной развертки. Это можно исправить следующим образом:[
] [echo filename | tee >(xargs stat) >(( wait $!; xargs file )) | cat
]
[]Это заставит команды выполняться по очереди и вывод никогда не будет чересстрочным.[
] []Вторая проблема заключается в том, чтобы избежать подстановки процесса, которая недоступна в некоторых оболочках, это может быть достигнуто с помощью tpipe вместо tee, так как:[
] [echo filename | tpipe 'xargs stat' | ( wait $!; xargs file )
]
[]Это должно быть переносимо почти на любую оболочку (я надеюсь) и решает проблемы в другой похвале, однако я пишу эту последнюю из памяти, так как моя текущая система не имеет tpipe.[
]. Обратите внимание, что goto
была отдельной утилитой, а не частью оболочки Томпсона как таковой.
Когда вы вызываете оболочку Thomson как:
sh the-script
sh
, открывает сценарий
на stdin
(fd 0), как если бы вы вместо этого написали
sh < the-script
.
Команда goto
будет искать
stdin обратно в начало (что, очевидно, если бы stdin был терминалом, а не обычным файлом), затем ищите там метку и сразу после этого оставит курсор в файле. Тогда снаряд продолжит свой путь оттуда.
Если вы хотите, чтобы команда в вашем скрипте считывала исходный стандартный ввод, вы должны использовать специальный оператор перенаправления <-
:
cmd <-
Обратите внимание, что с тем же самым goto
, ваш сценарий также будет работать с bash
, если вы вызовете сценарий оболочки Thomson как:
bash < the-script
ksh93
может эмулировать этот goto
со специальным поиском ] операторы перенаправления. Например, этот сценарий оболочки Thomson:
echo Start
: start
ls -ld /proc/self/fd/0
sleep 1
goto start
echo End never reached
Может быть записан на ksh93
как:
echo Start
: start
ls -ld /proc/self/fd/0
sleep 1
exec <#((0)) <#": start"
echo End never reached
Оба будут работать (при условии, что у вас есть команда V6 goto
) с ksh93
при запуске как:
ksh93 < the-script