ПРАКТИЧЕСКОЕ РУКОВОДСТВО: Обнаружьте удар из сценария оболочки

Сценарий - то, что пользователей просят получить файл сценария:

$ source envsetup.sh

Этот файл сценария может использовать удар только функция, таким образом, мы имеем, обнаруживают рабочую оболочку, удар или нет.

Для других оболочек, которые совместно используют общий синтаксис с ударом, например, sh, zsh, ksh, я хотел бы сообщить о предупреждении.

Что самый надежный путь состоит в том, чтобы обнаружить текущую оболочку через Linux, Cygwin, OS X?

То, что я знаю, является $BASH, но я задаюсь вопросом возможности, которые он мог привести к сбою.

9
задан Kan-Ru Chen 8 July 2010 в 00:28
поделиться

3 ответа

Есть куча переменных окружения, на которые вы можете посмотреть, но многие из них не определят, если из 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.

14
ответ дан 4 December 2019 в 06:29
поделиться

Переменная окружения SHELL скажет вам, какая оболочка входа запущена.

Также вы можете использовать ps $$ для поиска текущей оболочки, что можно использовать, если вы хотите знать, под какой оболочкой запущен скрипт (не обязательно оболочка входа). Чтобы сократить вывод ps только до имени оболочки: ps o command= $$ (не уверен, насколько это кроссплатформенно, но это работает на Mac OS X).

1
ответ дан 4 December 2019 в 06:29
поделиться

Это тоже работает

[ -z "$BASH_VERSION" ] && return
10
ответ дан 4 December 2019 в 06:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: