if ($answer_counter == 1): ?>
endif; ?>
Использовать файловую систему proc, чтобы узнать имя процесса оболочки
В случае сомнений используйте файловую систему /proc
. На каждом процессе есть папки с файлом comm
, где описывается команда этого процесса. Итак, зная PID оболочки, мы можем знать, что это за оболочка.
$ echo $$
4824
$ cat /proc/4824/comm
mksh
$ bash
[email protected]:~$ echo $$
6197
[email protected]:~$ cat /proc/6197/comm
bash
Есть и другие файлы, которые вы можете ссылаться на извлечение той же информации:
- / Proc / $$ / стат
- / Proc / $$ / состояние
- / Proc / $$ / CmdLine
- / proc / $$ / exe (символическая ссылка на сам исполняемый файл)
Это может не работать в старых ядрах или системах, которые не поддерживают файловую систему /proc
(Mac OS X, например).
Разница в том же подходе с командой ps
Команда
ps
имеет флаг -p
, который позволяет вам указать pid. Мы по-прежнему используем ту же идею ссылки на переменную $$
для этого.
$ ps -p $$
PID TTY TIME CMD
7728 pts/5 00:00:00 mksh
$ bash
[email protected]:~$ ps -p $$
PID TTY TIME CMD
7776 pts/5 00:00:00 bash
$0
vs $SHELL
.
Согласно Arch Wiki ,
SHELL contains the path to the user's preferred shell. Note that this is not necessarily the shell that is currently running, although Bash sets this variable on startup.
Другими словами, это интерактивная оболочка по умолчанию для пользователей, то же самое, что установлено в /etc/passwd
. Это также является причиной того, что переменная $ SHELL не изменяется для подоболочек . Например, независимо от того, сколько оболочек я создаю, переменная $SHELL
не изменяется:
$ echo $SHELL
/bin/mksh
$ bash --posix
bash-4.3$ echo $SHELL
/bin/mksh
bash-4.3$ dash
$ echo $SHELL
/bin/mksh
Аргумент
$0
отображает «self» - команду, с которой связана программа или имя файла. Итак, простой скрипт:
#!/bin/bash
echo $0
Будет выводиться следующим образом:
$ ./test_script.sh
./test_script.sh
Это также очевидно, когда вы делаете что-то вроде этого:
$ echo 'one two three' | xargs bash -c 'echo $0'
one
Для всех оболочек опция -c
помещает первый аргумент командной строки в переменную $0
.
Что касается интерактивной оболочки, обычно будет $ 0, но, как вы можете видеть, это не надежный способ узнать, какую оболочку вы используете. Знание процесса намного надежнее