Как проверить, какую оболочку я использую в терминале? Какую оболочку я использую в 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 считается вредными .)