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