Как выполнить что-либо в текущей оболочке

Как выполнить что-либо в текущей оболочке

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

 echo '#!/bin/bash 
  export foo="bar" ' > zoom.sh

но если я хочу запустить этот скрипт в текущем процессе:

exec ./zoom.sh

то мой терминал просто завершит работу с сообщением «процесс завершен», даже если я использую set +e, он все равно завершит работу.

Есть sourceи evalкоторые будут запускать вещи в текущей оболочке, так что, может быть, eval — мой лучший выбор? Функция bash будет работать, но мне придется положиться на пользователя sourceв первую очередь.

решение1

Из руководства следует, что exec не создает новый процесс, а просто заменяет текущую оболочку, поэтому после выполнения он также завершит сеанс.

exec [-cl] [-a name] [command [arguments]]:
Если указана команда, она заменяет оболочку. Новый процесс не создается. Аргументы становятся аргументами команды. Если указана опция -l, оболочка помещает тире в начало нулевого аргумента, переданного команде. Это то, что делает login(1). Опция -cзаставляет команду выполняться с пустой средой. Если -aуказана, оболочка передает имя в качестве нулевого аргумента выполняемой команде. Если команда не может быть выполнена по какой-либо причине, неинтерактивная оболочка завершает работу, если только опция оболочки не execfailвключена, в этом случае она возвращает ошибку. Интерактивная оболочка возвращает ошибку, если файл не может быть выполнен. Если команда не указана, любые перенаправления вступают в силу в текущей оболочке, и статус возврата равен 0. Если возникает ошибка перенаправления, статус возврата равен 1.

$ cat zoom.sh
#!/bin/bash
export foo="bar"
echo $?
$ exec ./zoom.sh
0
Connection to localhost closed

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