Виявлення оболонки за замовчуванням користувача в сценарії оболонки


10

Мені було цікаво, чи є спосіб дізнатись оболонку за замовчуванням поточного користувача в сценарії оболонки?

Використовуйте випадок: я працюю над сценарієм, який встановлює псевдонім для команди, і цей псевдонім встановлюється в сценарії оболонки.

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

У скрипті є логіка, де він намагається знайти оболонку за замовчуванням користувача, який виконує скрипт, і додає цей псевдонім у відповідний файл ~ / .bashrc або ~ / .zshrc

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

Чи є спосіб отримати тип оболонки, де виконується сценарій незалежно від набору shebang?

Я шукаю рішення, яке працює як на Mac, так і на всіх бістробітах на базі Linux.


@StephenRauch Я повинен був згадати це раніше, я шукаю метод, який працює як на Mac, так і на Linux. / etc / passwd на Mac не містить інформації про користувача, і лише в одному режимі користувач звертається до нього.
Іспанець89

Що /etc/passwdмає OSX? У мене був швидкий пошук в Інтернеті, і, схоже, оболонка є, тільки не ім’я користувача. Ідентифікатор користувача все ще існує, чому б вам не скористатися цим?
terdon

Мені було б цікаво, чи можливо навіть вичерпний список снарядів. Або всі файли запуску оболонки завжди відповідають. {Name_of_shell} rc?
jamesqf

Відповіді:


6
$ finger $USER|grep -oP 'Shell: \K.*'
/bin/mksh

Спасибі це працює як шарм! Це єдине рішення, яке, ймовірно, працює як для Mac, так і для Linux на базі бістро.
Іспанець89

1
До речі, я трохи відредагував команду, щоб зробити її агностичною для всіх ОС, finger $USER | grep 'Shell:*' | cut -f3 -d ":"оскільки опції grep -P не підтримуються на Mac.
Іспанець89

2
Зауважте, що fingerможе бути встановлено не на всіх машинах. Це необов'язковий пакет для систем на базі RedHat.
Стівен Гарріс

1
@Kishorepandey: ви можете використовувати getent|grep ^$USER:|cut -f: -f7замість пальця, якщо палець не встановлено за замовчуванням.
Іпор Сірсер

@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 не містить інформації про користувача, і лише в одному режимі користувач звертається до нього.
Іспанець89

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 ":"

Це не покращується в жодній із вже наданих відповідей.
Kusalananda

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