Как определить текущую оболочку, над которой я работаю?

567
задан Mat 2 May 2013 в 07:29
поделиться

6 ответов

  • Существует 3 подхода к нахождению имени исполняемого файла текущей оболочки:

    Обратите внимание, что все 3 подхода можно обмануть, если исполняемым файлом оболочки является / bin / sh , но на самом деле это, например, переименованный bash (что часто случается).

    Таким образом, на ваш второй вопрос о том, подойдет ли вывод ps , будет дан ответ « не всегда ».

    1. echo $ 0 - напечатает имя программы ... которое в случае оболочки является фактической оболочкой

    2. ps -ef | grep $$ | grep -v grep - Это будет искать идентификатор текущего процесса в списке запущенных процессов. Поскольку текущий процесс является оболочкой, он будет включен.

      Это ненадежно на 100%, так как у вас могут быть ДРУГИЕ процессы, у которых в листинге ps указан тот же номер, что и в идентификаторе процесса оболочки, особенно если этот идентификатор - маленький # (например, если PID оболочки равен "5 ", вы можете найти процессы с именами" java5 "или" perl5 "в том же выводе grep !). Это вторая проблема с подходом «ps», помимо невозможности полагаться на имя оболочки.

    3. echo $ SHELL - Путь к текущей оболочке сохраняется как переменная SHELL для любой оболочки. Предостережение для этого заключается в том, что если вы запускаете оболочку явно как подпроцесс (например, это не ваша оболочка входа в систему), вместо этого вы получите значение оболочки входа в систему. Если это возможно, используйте подход ps или $ 0 .


  • Если, однако, исполняемый файл не соответствует вашей реальной оболочке (например, / bin / sh на самом деле bash или ksh), вам нужна эвристика. Вот некоторые переменные среды, специфичные для различных оболочек:

    • $ версия установлена ​​на tcsh

    • $ BASH установлена ​​на bash

    • $ shell (нижний регистр) установлена ​​на фактическую оболочку имя в csh или tcsh

    • $ ZSH_NAME установлено на zsh

    • ksh имеет $ PS3 и $ PS4 , тогда как обычная оболочка Борна ( sh ) установлены только $ PS1 и $ PS2 . Как правило, это труднее всего различить - ЕДИНСТВЕННАЯ разница во всем наборе переменных среды между sh и ksh , которые мы установили на Solaris boxen, составляет $ ERRNO , $ FCEDIT , $ LINENO , $ PPID , $ PS3 , $ PS4 , $ RANDOM , $ SECONDS , $ TMOUT .

742
ответ дан 22 November 2019 в 22:05
поделиться

ps - самый надежный метод. Установка envar SHELL не гарантируется, и даже если это так, ее можно легко подделать

9
ответ дан 22 November 2019 в 22:05
поделиться

Вы можете попробовать:

ps | grep `echo $$` | awk '{ print $4 }'

Или:

echo $SHELL
19
ответ дан 22 November 2019 в 22:05
поделиться
echo $$ # Gives the Parent Process ID 
ps -ef | grep $$ | awk '{print $8}' #use the PID to see what the process is.

от http://www.unix.com/unix-dummies-questions-answers/10390-how-do-you-know-what-your-current-shell.html

2
ответ дан 22 November 2019 в 22:05
поделиться

ps -p $$

должны работать везде, где решения, включающие ps -ef и grep do (в любом варианте Unix, который поддерживает параметры POSIX для ps ) и не страдают от введенных ложных срабатываний путем поиска последовательности цифр, которые могут появиться в другом месте.

90
ответ дан 22 November 2019 в 22:05
поделиться

На Mac OS X (и FreeBSD):

ps -p $$ -axco command | sed -n '$p' 
1
ответ дан 22 November 2019 в 22:05
поделиться