Я хочу создать 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