труба кexec

труба кexec

Я не очень хорошо знаком с exec. Я прогоняю несколько тестов и примеров. Я хотел передать ему команду, записанную в файле. Я ожидаю, что эта команда будет запущена execтак же, как если бы она была запущена непосредственно в командной строке. Вот что я настроил и попробовал:

[kellyry@ch12ldvela00 ~]$ cat exec_test
ls
[kellyry@ch12ldvela00 ~]$ cat exec_test | exec
[kellyry@ch12ldvela00 ~]$ cat exec_test | xargs exec
xargs: exec: No such file or directory
[kellyry@ch12ldvela00 ~]$ exec ls
exec_test            file2             file3
. . .          

Вот самая странная часть. Запуск последней строки exec lsне возвращает результат. То есть терминал зависает, и я не могу с ним связаться. Я думаю, что эта последняя проблема может быть связана с Mobaxterm, который я использую для ssh-подключения к серверу.

решение1

Из bashстраницы руководства:

exec [-cl] [-a name] [command [arguments]]

Если commandуказано, то заменяет оболочку. Новый процесс не создается.

[...]

Если commandне указано, все перенаправления вступают в силу в текущей оболочке, а возвращаемый статус равен 0.

труба кexec

Первое, что вы попробовали, было

cat exec_test | exec

Это отправляет lsданные execна стандартный ввод, а не как аргумент. execзапускается без аргументов и не имеет перенаправлений, поэтому ничего не делает.

Если вы хотите запустить (или "выполнить") команду(ы) в файле, это не то, execдля чего. Вы можете сделать это с помощью source(или аббревиатуры .):

source exec_test

труба кxargs exec

Следующее, что вы попытались сделать,

cat exec_test | xargs exec

execэто тусовкавстроенный. Он доступен только в bash, поэтому xargsне могу его найти, чтобы выполнить.

execв основной оболочке

Наконец-то ты попробовал

exec ls

Это запустилось ls, а затем повесило терминал. Это потому, что, как документировано, он заменил процесс оболочки. После lsзавершения в терминале больше ничего не запущено. (Некоторые эмуляторы терминала автоматически закрываются в этот момент. К счастью, ваш не закрылся, поэтому вы все еще можете видеть вывод.)

Theпример, которому вы пытались следоватьбыл дополнительный шаг:

bash
exec ls

Сначала он запускает новый bash, работающий как дочерний по отношению к "верхнему уровню". exec lsЗатем заменяет эту оболочку и завершается. Затем возобновляется родительская оболочка, так что вы не остаетесь с застрявшим терминалом.

Связанный контент