Когда я использую exit
команду в сценарии оболочки, сценарий завершает работу терминала (приглашение). Есть ли способ завершить сценарий, а затем остаться в терминале?
run.sh
Предполагается, что мой сценарий будет выполнен напрямую из другого сценария.
РЕДАКТИРОВАТЬ: Чтобы быть более конкретным, есть два сценария run2.sh
как
...
. run.sh
echo "place A"
...
и run.sh
как
...
exit
...
когда я запускаю его . run2.sh
, и если он exit
достигает кодовой линии run.sh
, я хочу, чтобы он остановился в терминале и остался там. Но, используя exit
, весь терминал закрывается.
PS: я пытался использовать return
, но echo
кодовая строка будет по-прежнему выполняется ....
exit 0
для завершения сценария после успеха, при запуске сценария ex:./test.sh
вы должны увидеть выходные данные, но ваша консоль останется открытой.shell
команду, которая фактически открывает терминал оболочки. Однако мой собственный опыт показывает, что этого не происходитexit
. Выход обычно возвращает управление родительскому скрипту.Ответы:
«Проблема» в том, что вы используете источник, а не выполняете сценарий. Когда вы создаете исходный файл, его содержимое будет выполняться в текущей оболочке, а не порождать подоболочку. Так что все, включая выход, повлияет на текущую оболочку.
Вместо того, чтобы использовать
exit
, вы захотите использоватьreturn
.источник
runs.sh
@ruakh, и лучше ответить на этот вопрос.sh <script>
или,bash <script>
если кто-то хочет запустить скрипт и завершить его в какой-то моментДа; Вы можете использовать
return
вместоexit
. Его основное назначение - возврат из функции оболочки, но если вы используете ее вsource
сценарии -d, он возвращается из этого сценария.Как указано в п. 4.1 «Встроенные оболочки Bourne» Справочного руководства Bash :
источник
return
может использоваться ТОЛЬКО из функции. Если вы используетеreturn
и выполняете его как сценарий оболочки (напримерsh run.sh
), bash сообщит об ошибке -return: can only
return 'из скрипта функции или источника'return
это не будет работать, если скрипт запускается как скрипт оболочки и не выполняется. (илиsource
). Кстати, где я могу найти документ оsource -d
?Вместо запуска скрипта с помощью
. run2.sh
, вы можете запустить его с помощьюsh run2.sh
илиbash run2.sh
Будет запущена новая вложенная оболочка, для запуска сценария она будет закрыта в конце сценария, оставив другую открытую оболочку.
источник
sh "." run2.sh
?Вы можете добавить дополнительную команду выхода после оператора return / command, чтобы она работала как для выполнения сценария из командной строки, так и для получения из терминала.
Пример кода выхода в скрипте:
Строка с
exit
командой не будет вызываться, когда вы создаете сценарий послеreturn
команды.При выполнении скрипта
return
команда выдает ошибку. Итак, мы подавляем сообщение об ошибке, пересылая его/dev/null
.источник
На самом деле, я думаю, что вы можете быть смущены тем, как вы делаете
run a script
.Например, если вы используете
sh
для запуска сценария,sh ./run2.sh
даже если встроенный сценарий заканчиваетсяexit
, окно вашего терминала все равно останется.Однако, если вы используете
.
илиsource
, окно терминала также закроется и закроется, когда индекс завершится.более подробно см. в чем разница между использованием
sh
иsource
?источник
Это так же, как вы помещаете функцию запуска в ваш скрипт run2.sh. Вы используете код выхода внутри run, а исходный файл run2.sh - в bash tty. Если функция run дает возможность выйти из вашего скрипта и дает run2.sh возможность выйти из терминатора. Тогда у функции запуска есть возможность выйти из вашего теминатора.
Во всяком случае, я согласен с Kaz это проблема дизайна.
источник
У меня была та же проблема, и из приведенных выше ответов, а также из того, что я понял, в конечном итоге мне удалось:
Есть строка Шебанга, которая вызывает предполагаемый сценарий, например,
#!/bin/bash
используетbash
для выполнения скриптаУ меня есть сценарии с обоими видами Шебанга. Из-за этого использование
sh
или.
было ненадежным, так как это приводило к неправильному выполнению (например, когда сценарий вылетает не полностью)Таким образом, ответ был
(chmod +x file.sh)
Вызывать его напрямую без каких-либо
sh
или.
(./myscript.sh)
Надеюсь, что это помогает кому-то с похожим вопросом или проблемой.
источник
Я думаю, что это происходит, потому что вы запускаете его в исходном режиме с точкой
Вы должны запустить это в подоболочке:
'источник' http://ss64.com/bash/source.html
источник
. myscript.sh
работает. Самое большее, вам может понадобиться./myscript.sh
.Это верно, что исходные и исполняемые сценарии используют
return
против,exit
чтобы сохранить тот же сеанс открытым, как отметили другие.Вот соответствующий совет, если вам нужен скрипт, который должен держать сеанс открытым, независимо от того, получен он или нет.
Следующий пример может быть запущен напрямую как
foo.sh
или из источника. foo.sh
/source foo.sh
. В любом случае он будет держать сеанс открытым после «выхода».$@
Строка передаются так , что функция имеет доступ к аргументам внешнего скрипта.Терминальный результат:
Это может быть полезно для быстрого тестирования изменений скрипта в одном терминале, сохраняя кучу кода утилит под основным
exit
/return
во время работы. Это также может сделать код более переносимым в некотором смысле (если у вас есть тонны сценариев, которые могут вызываться или не вызываться по-разному), хотя гораздо проще использовать егоreturn
иexit
там, где это уместно.источник
если в вашем эмуляторе терминала его нет,
-hold
вы можете выполнить дезинфекцию исходного сценария и удерживать терминал с помощью:в противном случае вы можете использовать
$TERM -hold -e script
источник
Также не забудьте вернуться с ожидаемым возвращаемым значением. Иначе, если вы используете выход, когда вы встретите выход, он выйдет из вашей базовой оболочки, так как источник не создает другой процесс (экземпляр).
источник
Для того, чтобы написать сценарий , который является безопасным для запуска или как сценарий оболочки или источников в виде файла гс, сценарий может проверить и сравнить
$0
и$BASH_SOURCE
и определить,exit
можно безопасно использовать.Вот короткий фрагмент кода для этого
источник
1) выход 0 выйдет из скрипта, если он будет успешным.
2) выход 1 выйдет из скрипта, если он окажется неудачным.
Вы можете попробовать эти два выше на основе вашего требования.
источник