Выяснение оболочки пользователя по умолчанию в сценарии оболочки

10

Мне было интересно, если есть способ узнать оболочку по умолчанию текущего пользователя в сценарии оболочки?

Вариант использования: я работаю над сценарием, который устанавливает псевдоним для команды, и этот псевдоним устанавливается в сценарии оболочки.

!# /bin/bash
alias = 'some command to set the alias'

В скрипте есть логика, где он пытается найти оболочку по умолчанию для пользователя, который выполняет скрипт и добавляет этот псевдоним в соответствующий файл ~ / .bashrc или ~ / .zshrc

Но так как я добавляю shebang в начало сценария и явно прошу его использовать bash, ответы, размещенные здесь, всегда возвращают bash, как и ожидалось, хотя я выполняю этот сценарий на терминале ZSH.

Есть ли способ получить тип оболочки, где скрипт выполняется независимо от установленного Шебанга?

Я ищу решение, которое работает как на Mac, так и на всех бистро на основе Linux.

Spaniard89
источник
@ StephhenRauch Я должен был упомянуть об этом раньше, я ищу метод, который работает как на Mac, так и на Linux. / etc / passwd на Mac не содержит информации о пользователе, и к нему можно обращаться только в однопользовательском режиме.
Spaniard89
Что /etc/passwdимеет на OSX? Я быстро посмотрел в Интернете, и кажется, что оболочка есть, но не имя пользователя. Идентификатор пользователя все еще там, хотя, почему бы вам не использовать это?
Terdon
Интересно, можно ли получить исчерпывающий список снарядов? Или все файлы запуска оболочки всегда соответствуют. {Name_of_shell} rc?
jamesqf

Ответы:

6
$ finger $USER|grep -oP 'Shell: \K.*'
/bin/mksh
Ипор Сирсер
источник
Спасибо, это работает как шарм! Это единственное решение, которое, вероятно, работает как для бистро на основе Mac, так и для Linux.
Spaniard89
1
Кстати, я немного отредактировал команду, чтобы сделать ее независимой от всех ОС, так finger $USER | grep 'Shell:*' | cut -f3 -d ":"как параметры grep -P на Mac не поддерживаются.
Spaniard89
2
Обратите внимание, что fingerможет быть установлен не на всех машинах. Это необязательный пакет в системах на базе RedHat.
Стивен Харрис
1
@Kishorepandey: вы можете использовать getent|grep ^$USER:|cut -f: -f7вместо finger, если finger не был установлен по умолчанию.
Ипор Сирсер
@Kishorepandey Не делай этого. Используйте SHELLпеременную окружения, если она присутствует. Просмотр базы данных пользователя даст вам результат (оболочка входа пользователя), но это может быть неправильный результат (любимая интерактивная оболочка пользователя) - это зависит от конфигурации пользователя.
Жиль "ТАК - перестань быть злым"
19

Переменная окружения SHELLвсегда расширяется до оболочки входа по умолчанию для вызывающего пользователя (получает значение из /etc/passwd).

Для любого другого данного пользователя вам нужно выполнить некоторую обработку /etc/passwd, вот простой awkфрагмент:

awk -F: -v user="foobar" '$1 == user {print $NF}' /etc/passwd

Заменить foobarфактическим именем пользователя.

Если у вас есть ldap(или что-то подобное на месте), используйте getentдля получения базы данных вместо непосредственного анализа /etc/passwd:

getent passwd | awk -F: -v user="foobar" '$1 == user {print $NF}'

или getentсамый чистый подход, пусть разберется (спасибо @Kusalananda):

getent passwd foobar | awk -F: '{print $NF}'
heemayl
источник
3
getent passwd foobarпропустить необходимость совпадения с конкретной строкой.
Кусалананда
Спасибо за ответ. Я должен был упомянуть об этом раньше, я ищу метод, который работает как на Mac, так и на Linux. / etc / passwd на Mac не содержит информации о пользователе, и к нему можно обращаться только в однопользовательском режиме.
Spaniard89
4

Поскольку getentэто не стандартная команда в MacOS, вы можете использовать getpwuidвызов более низкого уровня, который свяжется со службами именования, для которых настроен компьютер. Это может потребовать вызова perlили python, что довольно часто встречается на большинстве Unix-подобных платформ.

например, это вернет оболочку для текущего пользователя:

perl -e '@x=getpwuid($<); print $x[8]'
Стивен Харрис
источник
2

Вы можете получить оболочку пользователя по умолчанию из окружения следующим образом:

echo $SHELL

Но не так:

echo $0

Последний просто скажет вам, какую оболочку использует ваш скрипт. Итак, вы хотите первый вариант выше.

Alxs
источник
0

Коротко и безболезненно:

getent passwd <USER> | cut -d : -f 7
Дэвид Фёрстер
источник
0

Может быть, это:

   grep $USER </etc/passwd | cut -f 7 -d ":"
user226946
источник
Это не улучшит ни один из уже приведенных ответов.
Кусалананда
Это не будет работать, если есть несколько пользователей с общими работами; например , если USER=fredтогда это будет соответствовать fred, frederick, alfred, alfredo...
Стивен Харрис