На этот вопрос уже есть ответ здесь:
Я подключен к удаленной оболочке, и многие клавиши, такие как стрелки и клавиша выхода, не работают должным образом. Этот ответ Клавиши со стрелками, tab-complete не работает предположил, что я мог быть в неправильной оболочке, поэтому я сослался на Как определить текущую оболочку, над которой я работаю? . Используя описанные методы, получаю странные результаты.
echo $SHELL
/bin/bash
но
echo $0
sh
Какую оболочку я использую?
Когда в сомнении, использовать /proc
файловая система. Существуют папки на каждый процесс, с comm
файл, где команда того процесса описана. Так, зная PID оболочки, мы можем знать то, что окружает его.
$ echo $$
4824
$ cat /proc/4824/comm
mksh
$ bash
xieerqi@eagle:~$ echo $$
6197
xieerqi@eagle:~$ cat /proc/6197/comm
bash
Существуют также другие файлы, на которые можно сослаться для извлечения той же самой информации:
Это не может работать над более старыми ядрами или системами, которые не поддерживают /proc
файловая система (Mac OS X, например).
ps
команда имеет -p
флаг, который позволяет Вам указывать pid. Мы все еще используем ту же идею сослаться $$
переменная для этого.
$ ps -p $$
PID TTY TIME CMD
7728 pts/5 00:00:00 mksh
$ bash
xieerqi@eagle:~$ ps -p $$
PID TTY TIME CMD
7776 pts/5 00:00:00 bash
$0
по сравнению с $SHELL
.Согласно дуге Wiki,
SHELL содержит путь к предпочтительной оболочке пользователя. Обратите внимание, что это - не обязательно оболочка, которая в настоящее время работает, хотя Bash устанавливает эту переменную на запуске.
Другими словами, это - интерактивная оболочка пользователей по умолчанию, тот же, который установлен в /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
аргумент отобразится "сам" - команда с который программа или название файла. Так простой сценарий как это:
#!/bin/bash
echo $0
Даст вывод как это:
$ ./test_script.sh
./test_script.sh
Это также очевидно, когда Вы делаете что-то вроде этого:
$ echo 'one two three' | xargs bash -c 'echo $0'
one
Для всех оболочек, -c
опция помещает первый параметр командной строки в $0
переменная.
Насколько интерактивная оболочка идет, 0$ обычно были бы достаточны, но как Вы видите, это не надежный способ знать то, что окружает, Вы используете. Знание процесса намного более надежно
Вы используете sh
. Поскольку $SHELL
относится к оболочке входа в систему, не в настоящее время одной, используемой.
Ваш обеспеченный ссылка вопроса о StackOverflow имеет корректный метод для корректного определения в настоящее время рабочей оболочки.
Вы, кажется, в настоящее время используете sh. Переключаться для избиения Вас могло просто ввести "удар"
Уже существует много больших данных ответов, но можно также попытаться выйти echo $BASH_VERSION
. Если это распечатывает номер версии, Вы находитесь в ударе. Если это производит пустую строку, Вы в некоторой другой оболочке.
Если удаленной ОС является Ubuntu (или другое основанное на GNU/Linux распределение), очень простой способ выяснить то, что окружает Вас, работают, должен выполнить эту команду:
ls -l /proc/$$/exe
если удаленной ОС не является Ubuntu или по крайней мере подобный GNU/дистрибутив Linux, Вы спросили в неправильном сайте.
Если по некоторым причинам удаленная ОС отсутствует /proc
(например, бег по разделенной, неполной, или старинной версии Ubuntu или возможно контейнеризированному экземпляру ОС), вышеупомянутая команда не будет работать.
Смотря $0
даст Вам ключ к разгадке, это не на 100% надежно. Любая программа может фальсифицировать свое имя к чему-то еще. В любом случае очень маловероятно, что Вы действительно работаете sh
(реальная Оболочка Bourne), поскольку это почти никогда не устанавливается на Linux, Вы могли бы работать sh
клон, вероятно dash
.