Я использую set -e, чтобы заставить мой скрипт завершаться всякий раз, когда при выполнении команды возникает ошибка. Однако это имеет побочный эффект, заключающийся в закрытии окна терминала шпатлевки, которое я использую для подключения через SSH к хосту.
Как мне остановить закрытие терминала?
Как вы запускаете сценарий? Обстоятельства выхода подпроцесса не должны влиять на оболочку, которая его запускала ... если только вы не загружаете скрипт в свою запущенную оболочку.
Например...
./my-script.sh # this should terminate and leave your shell intact
. my-script.sh # this might terminate and take your shell with it
Оболочка nix - это запущенный процесс некоторого интерпретатора оболочки (например, bash
, ksh
, csh
). "источник" скрипта (что можно сделать в bash
с командой source
или его псевдоним .
) сообщает этому интерпретатору открыть указанный файл и обработать его содержимое. По сути, сценарий становится ярлыком для интерактивного ввода команд. Определены функции, установлены переменные и (в вашем случае) exit
s обработанные вступают в силу в исходной оболочке.
./my-script.sh
это простой путь к файлу. ./
относится к текущему каталогу и my-script.sh
к сценарию в этом каталоге. Когда файл помечен как исполняемый, файл будет выполнен. В случае сценария это означает запуск нового процесса интерпретатора (как определено #!
строка в верхней части скрипта, или /bin/sh
по умолчанию) и использовать его для интерпретации скрипта. Определены функции, установлены переменные и exit
обрабатываются только этим новым процессом интерпретатора.