Я использую bash или sh? [дубликат]

На этот вопрос уже есть ответ здесь:

Я подключен к удаленной оболочке, и многие клавиши, такие как стрелки и клавиша выхода, не работают должным образом. Этот ответ Клавиши со стрелками, tab-complete не работает предположил, что я мог быть в неправильной оболочке, поэтому я сослался на Как определить текущую оболочку, над которой я работаю? . Используя описанные методы, получаю странные результаты.

echo $SHELL 
/bin/bash

но

echo $0
sh

Какую оболочку я использую?

7
задан 23 May 2017 в 05:39

5 ответов

Используйте proc файловую систему для знания имени процесса оболочки

Когда в сомнении, использовать /proc файловая система. Существуют папки на каждый процесс, с comm файл, где команда того процесса описана. Так, зная PID оболочки, мы можем знать то, что окружает его.

$ echo $$
4824
$ cat /proc/4824/comm                                                          
mksh
$ bash
xieerqi@eagle:~$ echo $$
6197
xieerqi@eagle:~$ 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
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$ обычно были бы достаточны, но как Вы видите, это не надежный способ знать то, что окружает, Вы используете. Знание процесса намного более надежно

10
ответ дан 23 November 2019 в 06:09

Вы используете sh. Поскольку $SHELL относится к оболочке входа в систему, не в настоящее время одной, используемой.

Ваш обеспеченный ссылка вопроса о StackOverflow имеет корректный метод для корректного определения в настоящее время рабочей оболочки.

10
ответ дан 23 November 2019 в 06:09

Вы, кажется, в настоящее время используете sh. Переключаться для избиения Вас могло просто ввести "удар"

2
ответ дан 23 November 2019 в 06:09

Уже существует много больших данных ответов, но можно также попытаться выйти echo $BASH_VERSION. Если это распечатывает номер версии, Вы находитесь в ударе. Если это производит пустую строку, Вы в некоторой другой оболочке.

1
ответ дан 23 November 2019 в 06:09

Если удаленной ОС является Ubuntu (или другое основанное на GNU/Linux распределение), очень простой способ выяснить то, что окружает Вас, работают, должен выполнить эту команду:

ls -l /proc/$$/exe

если удаленной ОС не является Ubuntu или по крайней мере подобный GNU/дистрибутив Linux, Вы спросили в неправильном сайте.

Если по некоторым причинам удаленная ОС отсутствует /proc (например, бег по разделенной, неполной, или старинной версии Ubuntu или возможно контейнеризированному экземпляру ОС), вышеупомянутая команда не будет работать.

Смотря $0 даст Вам ключ к разгадке, это не на 100% надежно. Любая программа может фальсифицировать свое имя к чему-то еще. В любом случае очень маловероятно, что Вы действительно работаете sh (реальная Оболочка Bourne), поскольку это почти никогда не устанавливается на Linux, Вы могли бы работать sh клон, вероятно dash.

4
ответ дан 23 November 2019 в 06:09

Другие вопросы по тегам:

Похожие вопросы: