Подсказки имеют смысл только тогда, когда оболочка является интерактивной. (Вы не хотели бы, чтобы они мешали, например, SFTP-соединениям ...) Чтобы проверить интерактивность, у вас есть два варианта:
Проверьте,
$-
содержит ли письмоi
.case $- in *i*) <do your prompts>;; *) return;; esac
Или же:
if ! case $- in *i*) false; esac; then <do your prompting> fi
Используйте
[ -t 0 ]
для проверки, является ли stdin (дескриптор файла # 0) терминалом:if [ ! -t 0 ]; then return fi
Или же:
if test -t 0; then <do prompts here> fi
(Поскольку ваш сценарий "получен" от родительского сценария, вызов return
внешних функций разрешен и вернется к родительскому сценарию. Это позволяет избежать дополнительного уровня отступов.)
Второй метод (проверка стандартного ввода) на самом деле не проверяет интерактивность - например, sh -l -c "some command"
он все равно будет проходить проверку при запуске через терминал. Но это все еще работает во многих случаях, потому что сервисам и соединениям SFTP не выделен терминал.