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


10

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

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

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

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

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

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

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


@ 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}'

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

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



0

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

   grep $USER </etc/passwd | cut -f 7 -d ":"

Это не улучшит ни один из уже приведенных ответов.
— Кусалананда

Это не будет работать, если есть несколько пользователей с общими работами; например , если USER=fredтогда это будет соответствовать fred, frederick, alfred, alfredo...
— Стивен Харрис
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.