Как делает выполнение изменения файла, которое ввел станд.?

[

]Способ, который я нашел, чтобы сделать это разумно просто использовать 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.[

].
1
06.01.2015, 01:42
1 ответ

Обратите внимание, что 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
2
27.01.2020, 23:37

Теги

Похожие вопросы