Как показатькаждыйустановленная оболочка командной строки (т.е. bash
, zsh
,и т. д.), без дубликатов и ничего больше (т.е. без программ, которые не являются оболочками)? Этот код почти работает на моемLubuntuсистема (в которой есть dash
, ksh
, zsh
, csh
и yash
), но печатает whiptail
и не печатает yash
:
apropos shell | grep sh | \
sed 's/ .*//;s/.*/which &/e;/^\/bin\//!d;s/.*/realpath &/e;/^\/bin\//!d' | \
sort -u | xargs whatis
bash (1) - GNU Bourne-Again SHell
bsd-csh (1) - a shell (command interpreter) with C-like syntax
dash (1) - command interpreter (shell)
ksh93 (1) - KornShell, a command and programming language
lksh (1) - Legacy Korn shell built on mksh
mksh (1) - MirBSD Korn shell
whiptail (1) - display dialog boxes from shell scripts
zsh5 (1) - the Z shell
решение1
На FreeBSD, TrueOS/PC-BSD, DragonFly BSD и т. д.
Списокодобренныйоболочки, т.е. оболочки, которые администратор разрешает пользователям изменятьоболочка входас chsh
командой, находится в обычном /etc/shells
файле. Простой
кот /etc/shellsдает список одобренных оболочек.
Однако это не совсем полный списокустановленоболочки. Хотя многие сторонние оболочки (сама операционная система, поставляемая с оболочками Almquist и TENEX C) устанавливаются сами /etc/shells
при установке из пакетов или портов, это не гарантируется, и, конечно, администратор мог изменить /etc/shells
так, что есть оболочка, которая былаустановленно это не такодобренный.
Списокустановленshells не так уж и сложно найти. Как уже упоминалось, оболочки Almquist и TENEX C поставляются с операционной системой, как /bin/sh
и /bin/tcsh
(он же /bin/csh
) соответственно. К ним добавляется список оболочек, которые устанавливаются из пакетов. В системе пакетов FreeBSD все оболочки находятся в shells/
области иерархии пакетов, поэтому можно просто использовать pkg
инструмент для запроса установленной базы данных пакетов:
запрос пакета "%o %n-%v %c" | awk '/^shells\// {$1="";print $0;}'
Это позволит обнаружить fish, rc, v7sh, heirloom-sh и им подобные, если они установлены, но также выдаст несколько ложных срабатываний для пакетов, которые находятся в иерархии, shells/
но не являются оболочками по сути, например, bash-completion.
дальнейшее чтение
На OpenBSD
OpenBSD похож на FreeBSD, TrueOS и т. д. с некоторыми отличиями. Один все еще работает
кот /etc/shellsчтобы увидеть список одобренных оболочек, и все еще существует разница между одобренными и установленными оболочками.
Однако в OpenBSD используется более старый менеджер пакетов и другой набор оболочек, входящих в состав самой операционной системы.
В OpenBSD сама операционная система поставляется с оболочкой Korn (в частности, pdksh) и оболочкой C (не TENEX C shell) как /bin/sh
(также известной как /bin/ksh
) и /bin/csh
(не /bin/tcsh
) соответственно.
Опять же, сторонние оболочки, которые добавляются в этот список, находятся в shells/
области иерархии пакетов, и команда для поиска установленных из них выглядит следующим образом:
pkg_info -P -A | grep '^shells/'
Если у вас установлен пакет sqlports, вы также можете использовать его sqlite3
для создания SQL-запросов к /usr/local/share/sqlports
базе данных для поиска установленных пакетов оболочки.
дальнейшее чтение
В Debian, Ubuntu и др.
Опять же, список одобренных оболочек можно получить с помощью
кот /etc/shellsи опять же это не то же самое, что список установленных оболочек.
В Debian и Ubuntu,каждыйОболочка управляется менеджером пакетов. Оболочек, которые "поставляются с операционной системой", не существует.
Опять же, все пакеты оболочки удобно помечены. APT (Advanced Packaging Tool) имеет понятие «разделов», а не иерархии, как в портах/пакетах BSD, и пакеты оболочки находятся в разделе Shells
.
Есть несколько инструментов, которые могут запрашивать базу данных менеджера пакетов. Я выбираю aptitude
здесь. Один из них запускает
поиск способностей '~i~sshells'который ищет установленные (
~i
) пакеты в разделе ( ~s
) с именем shells
.
Это aptitude
«сокращенный» синтаксис поиска. «Истинный» синтаксис поиска будет, '?installed ?section(shells)'
который немного сложнее набрать. Более того: вы можете aptitude
распечатать больше информации о каждом пакете с помощью его -F
параметра командной строки. Рассмотрите
поиск способностей -F '%p %v %t %d' '~i~sshells'например.
дальнейшее чтение
- Ракушки. packages.debian.org.
- Дэниел Берроуз и Мануэль А. Фернандес Монтесело (2016).руководство пользователя aptitude. Дебиан.
решение2
Вы можете использовать /etc/shells
файл. Он должен содержать список допустимых оболочек входа.