как проверить, какую оболочку я использую в терминале?

<p>как проверить, какую оболочку я использую в терминале? какую оболочку я использую в macos?</p>

<p>несколько способов, от большинства к наименее надежным (и от наиболее к наименее "тяжелым"):</p><ol> <li><code>ps -p$$ -ocmd=. (в solaris это может быть fname вместо cmd. в osx и bsd должно быть command вместо cmd.) проверить $bash\_version</code>, <code>$zsh_version и другие переменные, специфичные для shell. проверьте $shell</code>; это последнее средство, так как оно определяет вашу <em>по умолчанию</em> оболочку и не обязательно <em>текущую</em> оболочку.</li> </ol>

<p>я обнаружил, что следующие четыре оболочки, которые я установил в своей системе (bash, dash, zsh, csh):</p><pre><code>$ ps -p $$ следующее работает на zsh, bash и dash, но не на csh:$ echo $0 

поскольку вопрос касается используемой оболочки и не говорит о потенциальных передаваемых ей аргументах, вот способ избежать их показа:$ ps -o comm= -p $$ ksh93 

примечание о некоторых более легких реализациях (телефоны android, busybox и т.д.): ps не всегда поддерживает -p, но вы можете выполнить поиск с помощью команды, подобной ps | grep "^$$ "</code>. (это регулярное выражение <code>grep</code> однозначно идентифицирует pid, поэтому ложных срабатываний не будет.</p>

<p>есть два действительно простых способа:</p><ul> <li> <p>использование команды <a href="http://man7.org/linux/man-pages/man1/ps.1.html#examples"><strong> ps </strong></a> :</p> <pre><code>ps -o comm= $$  или ps -h -o comm -p $$ </code></pre> <p>где:</p> <ul> <li><code>-h</code> или заканчивая все параметры с помощью <code>=</code> за то, что не отображается заголовок.</li> <li><code>-o comm</code> для отображения только базового имени процесса (<code>bash</code> вместо <code>/bin/bash</code>).</li> <li><code>-p <pid></code> обрабатывать только список с предоставленным списком форм pid.</li> </ul> </li> <li> <p>использование <a href="http://man7.org/linux/man-pages/man5/proc.5.html"><strong>/proc </strong></a> псевдофайловой системы с информацией о процессе:</p> <pre><code>cat /proc/$$/comm  эта опция работает точно так же, как команда ps выше. или readlink /proc/$$/exe </code></pre> <p>эта <code>/proc/pid/exe</code> ссылки на исполняемый файл, который в этом случае будет указывать на/bin/bash,/bin/ksh и т. д.</p> <p>для получения только имени оболочки вы можете просто использовать</p> <pre><code>basename $(readlink /proc/$$/exe)  <strong> это единственная опция, которая всегда будет давать тот же результат, даже если вы находитесь в скрипте, исходном коде или терминале, как ссылки на двоичный файл используемого интерпретатора shell. </strong> <strong> предупреждение </strong> вы должны знать, что это покажет окончательный двоичный файл, поэтому 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 

если вы сохранили его в переменных окружения, вы можете использовать следующее:echo $shell </code></pre>

<p>pid запущенной оболочки дается переменной $$ (в большинстве оболочек).whichsh="ps -o pid,args| awk '$1=='"$$"'{print $2}'`" echo "$whichsh" использование обратных галочек для работы jsh (heirlomm shell).во многих снарядах прямой тест ps -o args= -p $$ работает, но busybox ash терпит неудачу на этом (решено).проверка, что $1</code> должно быть равно <code>$$ удаляет большинство ложных срабатываний.последний ;: используются для поддержки работы shell для ksh и zsh.тесты на большем количестве систем помогут, пожалуйста, оставьте комментарий, если он не работает для вас.не работает в оболочках типа csh.

я установил $myshell</code> для будущих тестов в моем shell-agnostic <code>~/.aliases</code>:</p><pre><code>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 </code></pre><p>раздел <code>tcsh</code>, скорее всего, неразумно свернуть в сценарий в стиле posix, поскольку он настолько радикально отличается (таким образом, предупреждение и пауза в пять секунд). (с одной стороны, <code>csh</code> - оболочки стиля не могут делать <code>2>/dev/null</code> или <code>>&2</code>, как отмечено в известном <a href="http://www.faqs.org/faqs/unix-faq/shell/csh-whynot/">программирование csh считается вредным</a> rant.)</p>