Любой способ выхода из скрипта bash, но не выход из терминала
когда я использую exit команда в сценарии оболочки, сценарий завершит терминал (приглашение). Есть ли способ завершить скрипт, а затем остаться в терминале?
мой скрипт run.sh ожидается, что он будет выполняться непосредственно из источника или из другого сценария.
изменить:
Чтобы быть более конкретным, есть два скрипта run2.sh как
...
. run.sh
echo "place A"
...
и run.sh как
...
exit
...
когда я запускаю его с помощью . run2.sh, а если это нажмите exit codeline in run.sh, Я хочу, чтобы он остановился на терминале и остался там. Но с помощью exit весь терминал закрывается.
PS: Я пытался использовать return, а echo codeline будет по-прежнему выполняется....
10 ответов:
"проблема" на самом деле заключается в том, что вы ищете и не выполняете сценарий. Когда вы создаете файл, его содержимое будет выполняться в текущей оболочке, а не порождать подоболочку. Так что все, включая выход, будет влиять на текущую оболочку.
вместо
exit, вы хотите использоватьreturn.
Да, вы можете использовать
returnвместоexit. Его основная цель-возврат из функции оболочки, но если вы используете ее в пределахsource-D скрипт, он возвращается из этого скрипта.как §4.1 "Bourne Shell Builtins" из Справочное Руководство Bash пишет:
return [n]вызовите функцию оболочки для выхода с возвращаемым значением n. Если n не поставляется, возвращаемое значение состояние выхода из системы последняя команда, выполняемая в функции. Это также может быть использовано для завершения выполнения выполняемого скрипта с помощью
.(илиsource) встроенный, возвращая либо n или состояние выхода последней команды, выполненной в скрипте в качестве выхода состояние скрипта. Любая команда, связанная сRETURNловушка выполнена перед выполнением возобновляется после выполнения функции или скрипта. Статус возврата не равен нулю, еслиreturnиспользуется за пределами функция и не во время выполнения скрипта.илиsource.
вместо запуска кода с помощью
. run2.shвы можете запустить скрипт с помощьюsh run2.shилиbash run2.sh
Новый экземпляр будет открыт для запуска скрипта, а затем он будет закрыт в конце скрипта, оставив другую оболочку открытой. -
Это так же, как вы положили функцию запуска внутри вашего скрипта run2.sh. Вы используете код выхода внутри run в то время как источник вашего run2.sh файл в Баш ТТИ. Если функция give the run имеет возможность выйти из вашего скрипта и дать run2.sh его сила, чтобы выйти из Терминатора. Затем, потому что функция запуска имеет возможность выйти из вашего теминатора.
#! /bin/sh # use . run2.sh run() { echo "this is run" #return 0 exit 0 } echo "this is begin" run echo "this is end"в любом случае, я согласен с КАЗ это проблема дизайна.
Я думаю, что это происходит потому, что вы используете его в режиме источника с точкой
. myscript.shвы должны запустить это в подоболочке:
/full/path/to/script/myscript.sh'source'http://ss64.com/bash/source.html
правильно, что исходные и выполненные скрипты используют
returnиexitчтобы сохранить тот же сеанс открытым, как отмечали другие.вот связанный совет, если вы когда-нибудь хотите скрипт, который должен держать сеанс открытым, независимо от того, является ли он источником.
следующий пример может быть запущен напрямую, как
foo.shили получены как. foo.sh/source foo.sh. В любом случае он будет держать сессию открытой после "выхода". Элемент$@строка передается так, что функция имеет доступ к аргументам внешнего скрипта.#!/bin/sh foo(){ read -p "Would you like to XYZ? (Y/N): " response; [ $response != 'y' ] && return 1; echo "XYZ complete (args $@)."; return 0; echo "This line will never execute."; } foo "$@";терминал результат:
$ foo.sh
$ Вы хотели бы XYZ? (Y/N): n
$ . foo.sh
$ Вы хотели бы XYZ? (Y/N): n
$ /
(окно терминала остается открытым и принимает дополнительный вход)это может быть полезно для быстрого тестирования изменений скрипта в одном терминале, сохраняя при этом кучу кода лома под основным
exit/returnв то время как вы работаете. Это также может сделать код более переносимым в некотором смысле (если у вас есть тонны скриптов, которые могут или не могут быть вызваны по-разному), хотя это гораздо менее неуклюжим, чтобы просто использоватьreturnиexitгде это уместно.
Если ваш эмулятор терминала нет
-holdвы можете очистить исходный скрипт и удерживать терминал с помощью:#!/bin/sh sed "s/exit/return/g" script >/tmp/script . /tmp/script readв противном случае вы можете использовать
$TERM -hold -e script
также не забудьте вернуться с ожидаемым возвращаемым значением. Иначе, если вы используете exit, когда вы столкнетесь с выходом, он выйдет из вашей базовой оболочки, так как источник не создает другой процесс (экземпляр).
чтобы написать сценарий, который является пуленепробиваемым для запуска как сценарий оболочки или был получен как rc-файл, скрипт может проверить и сравнить
и$BASH_SOURCEи определитьexitможно смело использовать.вот короткий фрагмент кода для этого
[ "X$(basename )" = "X$(basename $BASH_SOURCE)" ] && \ echo "***** executing $name_src as a shell script *****" || \ echo "..... sourcing $name_src ....."
1) выход 0 выйдет из скрипта, если он успешен.
2) Выход 1 выйдет из скрипта, если это провал.
вы можете попробовать их выше двух на основе ur req.
Comments