Мне было интересно, если есть способ узнать оболочку по умолчанию текущего пользователя в сценарии оболочки?
Вариант использования: я работаю над сценарием, который устанавливает псевдоним для команды, и этот псевдоним устанавливается в сценарии оболочки.
!# /bin/bash
alias = 'some command to set the alias'
В скрипте есть логика, где он пытается найти оболочку по умолчанию для пользователя, который выполняет скрипт и добавляет этот псевдоним в соответствующий файл ~ / .bashrc или ~ / .zshrc
Но так как я добавляю shebang в начало сценария и явно прошу его использовать bash, ответы, размещенные здесь, всегда возвращают bash, как и ожидалось, хотя я выполняю этот сценарий на терминале ZSH.
Есть ли способ получить тип оболочки, где скрипт выполняется независимо от установленного Шебанга?
Я ищу решение, которое работает как на Mac, так и на всех бистро на основе Linux.
источник
/etc/passwd
имеет на OSX? Я быстро посмотрел в Интернете, и кажется, что оболочка есть, но не имя пользователя. Идентификатор пользователя все еще там, хотя, почему бы вам не использовать это?Ответы:
источник
finger $USER | grep 'Shell:*' | cut -f3 -d ":"
как параметры grep -P на Mac не поддерживаются.finger
может быть установлен не на всех машинах. Это необязательный пакет в системах на базе RedHat.getent|grep ^$USER:|cut -f: -f7
вместо finger, если finger не был установлен по умолчанию.SHELL
переменную окружения, если она присутствует. Просмотр базы данных пользователя даст вам результат (оболочка входа пользователя), но это может быть неправильный результат (любимая интерактивная оболочка пользователя) - это зависит от конфигурации пользователя.Переменная окружения
SHELL
всегда расширяется до оболочки входа по умолчанию для вызывающего пользователя (получает значение из/etc/passwd
).Для любого другого данного пользователя вам нужно выполнить некоторую обработку
/etc/passwd
, вот простойawk
фрагмент:Заменить
foobar
фактическим именем пользователя.Если у вас есть
ldap
(или что-то подобное на месте), используйтеgetent
для получения базы данных вместо непосредственного анализа/etc/passwd
:или
getent
самый чистый подход, пусть разберется (спасибо @Kusalananda):источник
getent passwd foobar
пропустить необходимость совпадения с конкретной строкой.Поскольку
getent
это не стандартная команда в MacOS, вы можете использоватьgetpwuid
вызов более низкого уровня, который свяжется со службами именования, для которых настроен компьютер. Это может потребовать вызоваperl
илиpython
, что довольно часто встречается на большинстве Unix-подобных платформ.например, это вернет оболочку для текущего пользователя:
источник
Вы можете получить оболочку пользователя по умолчанию из окружения следующим образом:
Но не так:
Последний просто скажет вам, какую оболочку использует ваш скрипт. Итак, вы хотите первый вариант выше.
источник
Коротко и безболезненно:
источник
Может быть, это:
источник
USER=fred
тогда это будет соответствоватьfred
,frederick
,alfred
,alfredo
...