Bash

顯示每個已安裝的命令行 shell?

  • October 30, 2016

如何顯示每個已安裝的命令行shell(即bash,zsh等),沒有重複,沒有其他內容(即沒有不是 shell 的程序)?這段程式碼幾乎可以在我的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

在 FreeBSD、TrueOS/PC-BSD、DragonFly BSD 等。

已批准的 shell列表,即管理員允許使用者使用命令將登錄 shellchsh更改為的 shell ,位於正常/etc/shells文件中。一個簡單的

貓 /etc/shells

給出一個批准的 shell 列表。

但是,這並不是已安裝shell 的完整列表。儘管許多第三方 shell(Almquist 和 TENEX C shell 附帶的作業系統本身)/etc/shells在從包或埠安裝時會自行安裝,但這不能保證,當然管理員可能已經更改/etc/shells,因此有一個 shell已安裝但未獲批准

不過,安裝的 shell列表並不難找到。如前所述,Almquist 和 TENEX C shell 分別帶有作業系統 as/bin/sh/bin/tcsh(aka /bin/csh)。向他們添加從軟體包安裝的 shell 列表。在 FreeBSD 包系統中,所有的 shell 都在shells/包層級的範圍內,因此只需使用該pkg工具來查詢已安裝的包數據庫:

pkg 查詢 "%o %n-%v %c" | awk '/^shells\// {$1="";print $0;}'

這將擷取 fish、rc、v7sh、heirloom-sh 等,如果安裝了它們,但也會對shells/層次結構中但本身不是 shell 的包產生少量誤報,例如 bash-completion .

進一步閱讀

  • 貝殼/FreeBSD 埠樹。freebsd.org。
  • pkg-query. FreeBSD 手冊。2015.freebsd.org。

在 OpenBSD 上

OpenBSD 就像 FreeBSD、TrueOS 等。有一些差異。一個還在執行

貓 /etc/shells

查看已批准的外殼列表,已批准的外殼和已安裝的外殼之間仍然存在差異。

不過,OpenBSD 有一個較舊的包管理器,以及作業系統本身附帶的一組不同的 shell。

在 OpenBSD 上,作業系統本身帶有 Korn shell(特別是 pdksh)和 C shell(不是 TENEX C shell)分別作為/bin/sh(aka /bin/ksh) 和/bin/csh(not /bin/tcsh)。

同樣,添加到該列表的第三方 shellshells/位於包層次結構的區域中,因此查找已安裝的命令是

pkg_info -P -A | grep '^shells/'

如果您安裝了 sqlports 包,您還可以使用sqlite3/usr/local/share/sqlports數據庫進行 SQL 查詢以查找已安裝的 shell 包。

進一步閱讀

  • 貝殼/OpenBSD 埠樹。港口.su。
  • pkg_info. OpenBSD 手冊。2016.openbsd.org。

在 Debian、Ubuntu 等平台上。

同樣,可以通過以下方式獲得已批准的 shell 列表

貓 /etc/shells

這又與已安裝的 shell 列表不同。

在 Debian 和 Ubuntu 上,每個shell 都由包管理器管理。沒有“作業系統附帶”的外殼。

同樣,所有外殼包都被方便地標記。APT(高級打包工具)具有“部分”的概念,而不是 BSD 埠/包世界所具有的層次結構,並且 shell 包位於該Shells部分中。

有幾種工具可以查詢包管理器的數據庫。我選擇aptitude這裡。一跑

aptitude search '~i~sshells'

~i在名為.

~s_shells這是aptitude’ 的“速記”搜尋語法。“真正的”搜尋語法將'?installed ?section(shells)'是更多的類型。此外:您可以使用命令行選項aptitude列印出有關每個包的更多資訊。-F考慮

aptitude search -F '%p %v %t %d' '~i~sshells'

例如。

進一步閱讀

引用自:https://unix.stackexchange.com/questions/319735