Как получить оболочку по умолчанию

Мы можем запустить что-то вроде chsh -s /usr/local/bin/zsh, чтобы установить новую оболочку по умолчанию. Есть ли команда, которую мы можем запустить, чтобы узнать, что это за оболочка?

Я не имею в виду, что терминал открыт и запускает команду, чтобы узнать, в какую оболочку были включены. Я имею в виду, как в примере выше, если Im в терминале с /bin/bash открыт, что мне нужно запустить, чтобы получить /usr/local/bin/zsh if его текущая оболочка по умолчанию?

Ответ 1

вы можете использовать следующую команду echo $SHELL

Ответ 2

Для macOS:

dscl . -read /Users/username UserShell

Для текущего пользователя macOS:

dscl . -read ~/ UserShell

Для разбора пути в строке с помощью sed:

dscl . -read ~/ UserShell | sed 's/UserShell: //'

Использование $SHELL сообщит о текущей оболочке входа в систему, а не о оболочке входа по умолчанию. В некоторых случаях это не одно и то же. Например, при работе в среде IDE, такой как код Visual Studio, которая открывает интегрированный терминал, не обращаясь к оболочке по умолчанию.

Кроме того, как указал Martin C. Martin, $SHELL - это константа, которая не изменится после того, как chsh изменит оболочку входа по умолчанию.

Ответ 3

Вы можете grep в файле /etc/passwd для текущего имени пользователя и использовать cut для извлечения соответствующего столбца информации:

grep ^$(id -un): /etc/passwd | cut -d : -f 7-

$(id -un) безопаснее, чем $USER, чтобы получить имя пользователя. Используя ^ перед именем пользователя и : после того, как вы не получите ложное совпадение, если ваше имя пользователя является подразделением другого имени пользователя.

$SHELL также можно использовать, как было предложено. Однако это не сработает, если в текущей оболочке был использован chsh, поскольку переменная не обновляется. Также переменная не защищена от изменения, поэтому теоретически может быть установлено что-то совершенно другое.

Обновление для попытки решения, совместимого с OS X. Вероятно, не оптимальное регулярное выражение:

grep ^.*:.*:$(id -u): /etc/passwd | cut -d : -f 7-

Это зависит от идентификатора пользователя. Если отсутствует вся пользовательская запись, а не только имя пользователя, то osx должен хранить это где-то еще.

Ответ 4

если вы хотите получить стандартную оболочку пользователя, вы можете grep /etc/passwd. как:

kent$  grep "$USER" /etc/passwd
kent:x:1000:1000::/home/kent:/bin/zsh

сообщив, что текущий пользователь (kent) имеет оболочку по умолчанию /bin/zsh

если вы просто хотите поймать часть оболочки:

kent$  awk -F: -v u="$USER" 'u==$1&&$0=$NF' /etc/passwd
/bin/zsh

Если вы хотите получить оболочку по умолчанию другого пользователя, просто замените $USER часть.

Ответ 5

В OS X с помощью команды env | grep -i 'SHELL' выводится вывод, например: SHELL=/bin/sh (как root, однако обычные пользователи имеют тенденцию иметь /bin/ bash в качестве оболочки по умолчанию) с небольшим разбором, путь, который оболочка (и, следовательно, сама оболочка) может быть легко идентифицирована и извлечена оттуда.