Похоже, что эта странная концепция является результатом того факта, что bash
запускался не как клон оболочки POSIX, а как клон Bourne Shell
.
В результате интерактивное поведение POSIX ($ENV
, которое вызывается для интерактивных оболочек ), было добавлено позже к bash
и не получило широкой известности.
Существует одна оболочка, обеспечивающая аналогичное поведение. Это csh
, и csh предоставляет, что $prompt
имеет определенные значения :
$prompt not set non-interactive shell, test $?prompt.
$prompt set but == "" .cshrc called by the which(1) command.
$prompt set and != "" normal interactive shell.
Но это не относится ни к Bourne Shell, ни к оболочкам POSIX.
Для оболочки POSIX:единственный разрешенный метод - поместить код для интерактивных оболочек в файл:
$ENV
с именем, характерным для оболочки. Это, например,.
$HOME/.kshrc for the korn shell
$HOME/.bashrc for bash
$HOME/.mkshrc for mksh
$HOME/.shrc for the POSIX Bourne Shell
Другие люди упомянули флаг оболочки -i
, но его нельзя использовать для надежного программирования. POSIX не требует, чтобы set -i
работал, и чтобы $-
содержал i
для интерактивных оболочек. POSIX просто требует, чтобы sh -i
переводил оболочку в интерактивный режим.
Поскольку переменная $PS1
может быть импортирована из среды, она может иметь значение даже в не-интерактивном режиме. Тот факт, чтоbash
unset
s PS1
в любой не -интерактивной оболочке, не предусмотрен стандартом и не выполняется никакой другой оболочкой.
Таким образом, чистое программирование (даже сbash
)заключается в том, чтобы помещать команды для интерактивных оболочек в $HOME/.bashrc
.