Как проверить, какую оболочку я использую в терминале? Какую оболочку я использую в MacOS?
echo #SHELL
не совсем так. Смотрите # 3 в Ответе geekosaur .
xterm -e /bin/cat
но я не рад вызывать /bin/cat
оболочку.
Как проверить, какую оболочку я использую в терминале? Какую оболочку я использую в MacOS?
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):
$ ps -p $$
Следующее работает на zsh, bash и dash, но не на csh:
$ echo $0
%self
можно использовать вместо$$
Примечание о некоторых более легких реализациях (телефоны Android, busybox и т. Д.): ps
Не всегда есть поддержка -p
переключателя, но вы можете выполнить поиск с помощью команды, подобной ps | grep "^$$ "
. (Это grep
регулярное выражение будет однозначно идентифицировать PID, поэтому не будет никаких ложных срабатываний.
ps | grep $$
может по-прежнему давать ложные срабатывания, если, например, ваш текущий процесс 1234
и есть процесс 12345
.
Есть два действительно простых способа:
Используя команду ps :
ps -o comm= $$
или же
ps -h -o comm -p $$
где:
-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 текущей команды.
Смесь всех остальных ответов, совместимых с Mac (comm), Solaris (fname) и Linux (cmd):
ps -p$$ -o cmd="",comm="",fname="" 2>/dev/null | sed 's/^-//' | grep -oE '\w+' | head -n1
csh
и tcsh
это дает мнеAmbiguous output redirect.
Если вы сохранили его в переменных окружения, вы можете использовать следующее:
echo $SHELL
Pid запущенной оболочки задается переменной var $$ (в большинстве оболочек).
whichsh="`ps -o pid,args| awk '$1=='"$$"'{print $2}'`"
echo "$whichsh"
Использование обратных галочек для работы 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
:
unset MYSHELL
if [ -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
# verify
if [ ! -x "$MYSHELL" ]; then
MYSHELL=`command -v "$(ps $$ |awk 'NR == 2 { print $NF }')"`
[ -x "$MYSHELL" ] || MYSHELL="${SHELL:-/bin/sh}" # default if verify fails
fi
tcsh
Раздел, скорее всего , неразумно скатать в сценарий POSIX-стиле , так как это настолько радикально отличается (таким образом , предупреждение и пять второй паузы). (С одной стороны, csh
оболочки типа не могут 2>/dev/null
или >&2
, как отмечалось в знаменитой программе Csh Programming считается вредными .)