Правильная оболочка KSH не должна вызывать $ ENV при запуске скрипта. Тем не менее, это давно существующая ошибка в диалекте Sun ksh88
, и она была исправлена поздно в Solaris 10. (Весьма неожиданно, поскольку Sun традиционно очень неохотно изменял существующее поведение, потому что такие исправления могли обойти обходные пути. кейс стандарт преобладал.)
Чтобы запретить sun ksh88 читать $ ENV при запуске сценария, было общеизвестно использовать обходной путь #!/bin/ksh -p
, и это было безопасно, если у вас не было /etc/suid_profile
зависания.
Тем не менее, $ - - это надежный индикатор интерактивной оболочки, если вы ее не фальсифицировали.
$ cat interactive.sh
echo \$- = $-
[[ $- == *i* ]] && echo interactive || echo not interactive
При запуске как скрипт это дает:
$ ksh interactive.sh
$- = hB
not interactive
Когда мы подделываем флаг -i
, вы получаете то, что просите:
$ ksh -i interactive.sh
$- = imBE
interactive
И когда он получен из интерактивной оболочки, он будет делать правильные вещи:
$ . ./interactive.sh
$- = imsBEl
interactive