@xenoterracide: по крайней мере unix.stackexchange.com/questions/3645/… . Ответ geekosaur является более полным, поэтому я проголосовал за закрытие предыдущего вопроса.
«SO- перестать быть злым» Жиля
1
эхо $ SHELL, нет?
мир невинных
@ innocent-world Нет, echo #SHELLне совсем так. Смотрите # 3 в Ответе geekosaur .
Василий Бурк
Я не уверен, что «оболочка» имеет четко определенный смысл. Например, вы можете запустить, xterm -e /bin/cat но я не рад вызывать /bin/catоболочку.
Старынкевич
Также некоторые оболочки (например, scsh ) не используют оболочку POSIX, как синтаксис.
Старынкевич,
Ответы:
71
Несколько способов, от большинства к наименее надежным (и от наиболее к наименее «тяжелым»):
ps -p$$ -ocmd=, (В Solaris это может потребоваться fnameвместо cmd. В OSX и BSD должно быть commandвместо cmd.)
Проверьте $BASH_VERSION, $ZSH_VERSIONи другие переменные оболочки специфические.
Проверить $SHELL; это последнее средство, так как оно определяет оболочку по умолчанию, а не обязательно текущую оболочку.
Мне не нравится, $0потому что это более сложно: (1) это может быть просто базовое имя, (2) оно может иметь «-» на передней панели, чтобы обозначить его как оболочку входа в систему.
geekosaur
ps -p$$ -ocmd=""красивее :-)
asoundmove
1
@geekosaur: может быть и так, но $0все же кажется более полезным, чем $SHELL: вы не согласны? Вы всегда можете пропустить это, sedчтобы удалить «-».
иконоборчество
2
Если вы работаете tcsh, $tcshи $versionбудет установлено. Это переменные оболочки, а не переменные среды. Если вы используете не-tcsh версию csh, я не думаю, что есть какие-либо отличительные переменные. И, конечно же, синтаксис, используемый для проверки переменных, отличается между csh / tcsh с одной стороны и sh / ksh / bash / zsh с другой.
Кит Томпсон
41
Я обнаружил, что следующие четыре оболочки, которые я установил в своей системе (bash, dash, zsh, csh):
$ ps -p $$
Следующее работает на zsh, bash и dash, но не на csh:
Примечание о некоторых более легких реализациях (телефоны Android, busybox и т. Д.): psНе всегда есть поддержка -pпереключателя, но вы можете выполнить поиск с помощью команды, подобной ps | grep "^$$ ". (Это grepрегулярное выражение будет однозначно идентифицировать PID, поэтому не будет никаких ложных срабатываний.
-hили завершить все варианты, =чтобы не отображать заголовки.
-o commдля отображения только базового имени процесса ( bashвместо /bin/bash).
-p <PID> список только процесс, с которым поставляется список форм PID.
Использование псевдофайловой системы с информацией о процессе / proc :
cat /proc/$$/comm
Эта опция ведет себя точно так же, как psкоманда выше.
или же
readlink /proc/$$/exe
Это /proc/PID/exeссылка на исполняемый файл, который в этом случае будет указывать на / bin / bash, / bin / ksh и т. Д.
Для получения только названия оболочки вы можете просто использовать
basename $(readlink /proc/$$/exe)
Это единственная опция, которая всегда будет давать тот же результат, даже если вы находитесь в скрипте, исходном коде или терминале, как ссылки на двоичный файл используемого интерпретатора оболочки.
Предупреждение Вы должны знать, что это покажет окончательный двоичный файл, поэтому ksh может быть связан с ksh93 или sh с bash.
Использование /procдействительно полезно через /proc/self, который ссылается на PID текущей команды.
Это, скорее всего, вернет путь к исполняемому файлу оболочки вашей оболочки входа в систему. Хотя вы не уверены, что оболочка для входа - это то, что вы сейчас используете.
Кусалананда
1
Pid запущенной оболочки задается переменной var $$ (в большинстве оболочек).
В OS / X в моих тестах я получил как минимум 3 строки: одну для оболочки, одну для /usr/lib/dyld, одну для /private/var/db/dyld/dyld_shared_cache_x86_64.
Стефан Шазелас
Да, теперь он только выбирает записи в / bin и / usr / bin
Стефан Шазелас
@ StéphaneChazelas Может, сейчас лучше?
0
Я настроен $MYSHELLна будущие тесты в моей оболочке-агностике ~/.aliases:
unset MYSHELLif[-n "$ZSH_VERSION"]&& type zstyle >/dev/null 2>&1;then# zsh
MYSHELL=`command -v zsh`elif[-x "$BASH"]&& shopt -q >/dev/null 2>&1;then# bash
MYSHELL=`command -v bash`elif[-x "$shell"]&& which setenv |grep builtin >/dev/null;then# tcsh
echo "DANGER: this script is likely not compatible with C shells!"
sleep 5
setenv MYSHELL "$shell"fi# verifyif[!-x "$MYSHELL"];then
MYSHELL=`command -v "$(ps $$ |awk 'NR == 2 { print $NF }')"`[-x "$MYSHELL"]|| MYSHELL="${SHELL:-/bin/sh}"# default if verify failsfi
tcshРаздел, скорее всего , неразумно скатать в сценарий POSIX-стиле , так как это настолько радикально отличается (таким образом , предупреждение и пять второй паузы). (С одной стороны, cshоболочки типа не могут 2>/dev/nullили >&2, как отмечалось в знаменитой программе Csh Programming считается вредными .)
Вы можете просто использовать echo $0команду, чтобы проверить, какую оболочку вы используете, и <name_of_the_shell> --versionпроверить версию оболочки. (например. bash --version)
echo #SHELL
не совсем так. Смотрите # 3 в Ответе geekosaur .xterm -e /bin/cat
но я не рад вызывать/bin/cat
оболочку.Ответы:
Несколько способов, от большинства к наименее надежным (и от наиболее к наименее «тяжелым»):
ps -p$$ -ocmd=
, (В Solaris это может потребоватьсяfname
вместоcmd
. В OSX и BSD должно бытьcommand
вместоcmd
.)$BASH_VERSION
,$ZSH_VERSION
и другие переменные оболочки специфические.$SHELL
; это последнее средство, так как оно определяет оболочку по умолчанию, а не обязательно текущую оболочку.источник
$0
тоже должны упомянуть ?$0
потому что это более сложно: (1) это может быть просто базовое имя, (2) оно может иметь «-» на передней панели, чтобы обозначить его как оболочку входа в систему.ps -p$$ -ocmd=""
красивее :-)$0
все же кажется более полезным, чем$SHELL
: вы не согласны? Вы всегда можете пропустить это,sed
чтобы удалить «-».tcsh
,$tcsh
и$version
будет установлено. Это переменные оболочки, а не переменные среды. Если вы используете не-tcsh версиюcsh
, я не думаю, что есть какие-либо отличительные переменные. И, конечно же, синтаксис, используемый для проверки переменных, отличается между csh / tcsh с одной стороны и sh / ksh / bash / zsh с другой.Я обнаружил, что следующие четыре оболочки, которые я установил в своей системе (bash, dash, zsh, csh):
Следующее работает на zsh, bash и dash, но не на csh:
источник
%self
можно использовать вместо$$
Поскольку вопрос касается используемой оболочки и не говорит о потенциальных передаваемых ей аргументах, вот способ избежать их показа:
источник
Примечание о некоторых более легких реализациях (телефоны Android, busybox и т. Д.):
ps
Не всегда есть поддержка-p
переключателя, но вы можете выполнить поиск с помощью команды, подобнойps | grep "^$$ "
. (Этоgrep
регулярное выражение будет однозначно идентифицировать PID, поэтому не будет никаких ложных срабатываний.источник
ps | grep $$
может по-прежнему давать ложные срабатывания, если, например, ваш текущий процесс1234
и есть процесс12345
.Есть два действительно простых способа:
Используя команду ps :
или же
где:
-h
или завершить все варианты,=
чтобы не отображать заголовки.-o comm
для отображения только базового имени процесса (bash
вместо/bin/bash
).-p <PID>
список только процесс, с которым поставляется список форм PID.Использование псевдофайловой системы с информацией о процессе / proc :
Эта опция ведет себя точно так же, как
ps
команда выше.или же
Это
/proc/PID/exe
ссылка на исполняемый файл, который в этом случае будет указывать на / bin / bash, / bin / ksh и т. Д.Для получения только названия оболочки вы можете просто использовать
Это единственная опция, которая всегда будет давать тот же результат, даже если вы находитесь в скрипте, исходном коде или терминале, как ссылки на двоичный файл используемого интерпретатора оболочки.
Предупреждение Вы должны знать, что это покажет окончательный двоичный файл, поэтому ksh может быть связан с ksh93 или sh с bash.
Использование
/proc
действительно полезно через/proc/self
, который ссылается на PID текущей команды.источник
Смесь всех остальных ответов, совместимых с Mac (comm), Solaris (fname) и Linux (cmd):
источник
csh
иtcsh
это дает мнеAmbiguous output redirect.
Если вы сохранили его в переменных окружения, вы можете использовать следующее:
источник
Pid запущенной оболочки задается переменной var $$ (в большинстве оболочек).
Использование обратных галочек для работы jsh (оболочки Heirlomm).
Во многих оболочках прямой тест
ps -o args= -p $$
работает, но на этомbusybox ash
не проходит (решается).Проверка, которая
$1
должна быть равна$$
удаляет большинство ложных срабатываний.Последние
;:
используются для поддержки оболочки для ksh и zsh.Тесты на большем количестве систем помогут, пожалуйста, оставьте комментарий, если он не работает для вас.
Не работает в
csh
типе снарядов.источник
/usr/lib/dyld
, одну для/private/var/db/dyld/dyld_shared_cache_x86_64
.Я настроен
$MYSHELL
на будущие тесты в моей оболочке-агностике~/.aliases
:tcsh
Раздел, скорее всего , неразумно скатать в сценарий POSIX-стиле , так как это настолько радикально отличается (таким образом , предупреждение и пять второй паузы). (С одной стороны,csh
оболочки типа не могут2>/dev/null
или>&2
, как отмечалось в знаменитой программе Csh Programming считается вредными .)источник
Вы можете просто использовать
echo $0
команду, чтобы проверить, какую оболочку вы используете, и<name_of_the_shell> --version
проверить версию оболочки. (например.bash --version
)источник
Это тоже работает:
источник