Как выполнить bash-скрипт без выхода из оболочки - PullRequest
0 голосов
/ 31 мая 2019

Я хочу выполнить bash-скрипт в текущей оболочке, а не подоболочку / подпроцесс.Я считаю, что использование exec позволяет вам сделать это.Но если я запущу:

exec ./my_script.sh

, оболочка выйдет и выдаст сообщение «процесс завершен».Есть ли способ выполнить скрипт в той же оболочке как-нибудь без выхода из процесса.

обратите внимание, единственное, что делает my_script.sh:

export foo=bar

, но если есть некоторыеошибка в моем скрипте, она не появилась в консоли.

Ответы [ 3 ]

2 голосов
/ 31 мая 2019

Как сказал @Snakienn, вы можете / должны использовать "." встроенная команда для «источника» файла, содержащего команды; например,

 . ./my_script.sh

Для этого нужно временно изменить, откуда оболочка читает команды. Команды и другие входные данные оболочки читаются из файла, как если бы они читались из терминала. Когда оболочка достигает конца файла, она переключается обратно на получение ввода с консоли.

Это называется "источником". (Не "execing".) И действительно, оболочка принимает source в качестве альтернативного имени для команды ..

Команда exec делает что-то совершенно другое. Как сказано в ручном вводе bash:

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

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

Концепция и терминология exec происходят из ранней UNIX (т.е. Unix V6 или более ранней), где системными вызовами для запуска дочерней команды были fork и exec. Процедура была:

  • fork текущий процесс, создающий клон текущего процесса (дочерний)
  • в дочернем процессе exec новая команда
  • в родительском процессе, дождитесь завершения дочернего процесса
0 голосов
/ 31 мая 2019

Страница руководства гласит: -

exec [-cl] [-a имя] [команда [аргументы]] Если указана команда, она заменяет оболочку. Нет нового процесса создано. Аргументы становятся аргументами команды. Если опция -l указана, оболочка ставит тире в начало нулевого аргумента, передаваемого команде. что делает логин (1). Опция -c приводит к выполнению команды с пустой средой.

если вы хотите выполнить bash-скрипт в текущей оболочке, вы можете попробовать

bash my_script.sh или ./my_script.sh

0 голосов
/ 31 мая 2019

вы можете попробовать . ./my_script.sh.

Первая точка обозначает текущую оболочку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...