Zastanawiałem się, czy w skrypcie powłoki można znaleźć domyślną powłokę bieżącego użytkownika?
Przypadek użycia: Pracuję nad skryptem, który ustawia alias dla polecenia, a ten alias jest ustawiony w skrypcie powłoki.
!# /bin/bash
alias = 'some command to set the alias'
W skrypcie jest logika, w której próbuje on znaleźć domyślną powłokę użytkownika, który wykonuje skrypt i dodaje ten alias do odpowiedniego pliku ~ / .bashrc lub ~ / .zshrc
Ale kiedy dodałem shebang na początku skryptu i wyraźnie prosiłem go o użycie basha, odpowiedzi zamieszczone tutaj zawsze zwracają bash zgodnie z oczekiwaniami, chociaż wykonuję ten skrypt na terminalu ZSH.
Czy istnieje sposób na uzyskanie typu powłoki, w którym skrypt jest wykonywany, niezależnie od zestawu shebang?
Szukam rozwiązania, które działa zarówno na Macu, jak i na wszystkich bistro opartych na systemie Linux.
źródło
/etc/passwd
ma na OSX? Rzuciłem okiem w Internecie i wygląda na to, że jest tam powłoka, ale nie nazwa użytkownika. Identyfikator użytkownika wciąż tam jest, dlaczego tego nie użyjesz?Odpowiedzi:
źródło
finger $USER | grep 'Shell:*' | cut -f3 -d ":"
ponieważ opcje grep -P nie są obsługiwane na Macu.finger
może nie być zainstalowany na wszystkich komputerach. Jest to opcjonalny pakiet w systemach opartych na RedHat.getent|grep ^$USER:|cut -f: -f7
zamiast palca, jeśli palec nie został zainstalowany domyślnie.SHELL
zmiennej środowiskowej, jeśli jest obecna. Spojrzenie na bazę danych użytkownika da wynik (powłoka logowania użytkownika), ale może nie być to właściwy wynik (ulubiona interaktywna powłoka użytkownika) - zależy to od konfiguracji użytkownika.Zmienna środowiskowa
SHELL
zawsze rozwija się do domyślnej powłoki logowania użytkownika wywołującego (pobiera wartość z/etc/passwd
).Dla każdego innego użytkownika musisz wykonać pewne przetwarzanie
/etc/passwd
, oto prostyawk
fragment:Zastąp
foobar
rzeczywistą nazwą użytkownika.Jeśli masz
ldap
(lub coś podobnego na miejscu), użyj,getent
aby uzyskać bazę danych zamiast bezpośredniego analizowania/etc/passwd
:lub najczystsze podejście,
getent
parsujmy (dzięki @Kusalananda):źródło
getent passwd foobar
pominąć konieczność dopasowania do określonej linii.Ponieważ
getent
nie jest to standardowe polecenie w systemie MacOS, możesz skorzystać zgetpwuid
wywołania niższego poziomu , które skonsultuje usługi nazewnictwa, dla których urządzenie jest skonfigurowane. Może to wymagać wywołaniaperl
lubpython
, które są dość powszechne na większości platform uniksowychnp. to zwróci powłokę dla bieżącego użytkownika:
źródło
Możesz pobrać domyślną powłokę użytkownika ze środowiska w następujący sposób:
Ale nie tak:
Ten ostatni powie ci tylko, jakiej powłoki używa Twój skrypt. Więc chcesz pierwszą opcję powyżej.
źródło
Krótkie i bezbolesne:
źródło
Może to:
źródło
USER=fred
wtedy będzie to pasujefred
,frederick
,alfred
,alfredo
...