На FreeBSD, TrueOS/PC-BSD, DragonFly BSD и т. д.

На FreeBSD, TrueOS/PC-BSD, DragonFly BSD и т. д.

Как показатькаждыйустановленная оболочка командной строки (т.е. 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.

дальнейшее чтение

  • ракушки/. Дерево портов FreeBSD. freebsd.org.
  • pkg-query. Руководство FreeBSD. 2015. freebsd.org.

На 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базе данных для поиска установленных пакетов оболочки.

дальнейшее чтение

  • ракушки/. Дерево портов OpenBSD.ports.su.
  • pkg_info. Руководство OpenBSD. 2016. openbsd.org.

В 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'
например.

дальнейшее чтение

решение2

Вы можете использовать /etc/shellsфайл. Он должен содержать список допустимых оболочек входа.

Связанный контент