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

6

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

echo $SHELL 
/bin/bash

, но

echo $0
sh

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

задан Info5ek 17.09.2016 в 22:19
источник

5 ответов

10

Использовать файловую систему 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, но, как вы можете видеть, это не надежный способ узнать, какую оболочку вы используете. Знание процесса намного надежнее

    
ответ дан Sergiy Kolodyazhnyy 17.09.2016 в 22:36
источник
10

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

Предоставленный ссылка на вопросник StackOverflow содержит правильный метод для корректного определения текущей рабочей оболочки.     

ответ дан Anwar 17.09.2016 в 22:25
4

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

ls -l /proc/$$/exe

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

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

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

ответ дан jlliagre 17.09.2016 в 22:52
2

вы, похоже, используете sh. Чтобы переключиться на bash, вы можете просто набрать «bash»

    
ответ дан Artful Aardvark 17.09.2016 в 22:25
1

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

    
ответ дан Zoltan 18.09.2016 в 00:06