Сценарий - то, что пользователей просят получить файл сценария:
$ source envsetup.sh
Этот файл сценария может использовать удар только функция, таким образом, мы имеем, обнаруживают рабочую оболочку, удар или нет.
Для других оболочек, которые совместно используют общий синтаксис с ударом, например, sh, zsh, ksh, я хотел бы сообщить о предупреждении.
Что самый надежный путь состоит в том, чтобы обнаружить текущую оболочку через Linux, Cygwin, OS X?
То, что я знаю, является $BASH, но я задаюсь вопросом возможности, которые он мог привести к сбою.
Есть куча переменных окружения, на которые вы можете посмотреть, но многие из них не определят, если из bash порождена другая оболочка. Рассмотрим следующее:
bash$ echo "SHELL: $SHELL, shell: $shell, ARGV[0]: $0, PS1: $PS1, prompt: $prompt"
SHELL: /bin/bash, shell: , ARGV[0]: -bash, PS1: bash$ , prompt:
bash$ csh
[lorien:~] daveshawley% echo "SHELL: $SHELL, shell: $shell, \$0: $0, PS1: $PS1, prompt: $prompt"
SHELL: /bin/bash, shell: /bin/tcsh, ARGV[0]: csh, PS1: bash$ , prompt: [%m:%c3] %n%#
[lorien:~] daveshawley% bash -r
bash$ echo "SHELL: $SHELL, shell: $shell, ARGV[0]: $0, PS1: $PS1, prompt: $prompt"
SHELL: /bin/bash, shell: , ARGV[0]: sh, PS1: bash$ , prompt:
bash$ zsh
% echo "SHELL: $SHELL, shell: $shell, ARGV[0]: $0, PS1: $PS1, prompt: $prompt"
SHELL: /bin/bash, shell: , ARGV[0]: zsh, PS1: % , prompt: %
% ksh
$ echo "SHELL: $SHELL, shell: $shell, ARGV[0]: $0, PS1: $PS1, prompt: $prompt"
SHELL: /bin/bash, shell: , ARGV[0]: ksh, PS1: bash$ , prompt:
Есть ряд переменных, специфичных для различных оболочек, но они имеют привычку наследоваться вложенными оболочками, и вот тут-то окружение действительно ломается. Единственное, что почти работает, это ps -o command -p $$
. Это технически дает вам имя команды, от имени которой запущена оболочка. В большинстве случаев это сработает... поскольку приложения запускаются с помощью какого-то варианта системного вызова exec
, а он позволяет различать имя команды и исполняемого файла, это тоже может не сработать. Рассмотрим:
bash$ exec -a "-csh" bash
bash$ echo "$0, $SHELL, $BASH"
-csh, /bin/bash, /bin/bash
bash$ ps -o command -p $$
COMMAND
-csh
bash$
Еще один трюк - использовать lsof -p $$ | awk '(NR==2) {print $1}'
. Это, вероятно, настолько близко, насколько вы можете получить, если вам повезло иметь под рукой lsof
.
Переменная окружения SHELL
скажет вам, какая оболочка входа запущена.
Также вы можете использовать ps $$
для поиска текущей оболочки, что можно использовать, если вы хотите знать, под какой оболочкой запущен скрипт (не обязательно оболочка входа). Чтобы сократить вывод ps
только до имени оболочки: ps o command= $$
(не уверен, насколько это кроссплатформенно, но это работает на Mac OS X).