如何展示每一个安装了命令行 shell,(即bash
,,zsh
ETC。),没有重复项,也没有其他内容(即没有不是 shell 的程序)?这段代码几乎适用于我的卢本图系统,(有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 等上。
名单得到正式认可的shell,即管理员允许用户更改其权限的 shell登录外壳to 与chsh
命令一起,位于常规/etc/shells
文件中。一个简单的
猫 /etc/shell给出了批准的 shell 的列表。
然而,这并不是完整的列表已安装贝壳。尽管许多第三方 shell(操作系统本身附带 Almquist 和 TENEX C shell)/etc/shells
在从软件包或端口安装时会自行安装,但这并不能保证,当然管理员可能已更改,/etc/shells
因此有一个 shell已安装但这不是得到正式认可的。
名单已安装不过,贝壳并不难获得。如前所述,Almquist 和 TENEX C shell 附带操作系统,分别为/bin/sh
和/bin/tcsh
(又名/bin/csh
)。向其中添加从软件包安装的 shell 列表。在 FreeBSD 软件包系统中,所有 shell 都位于shells/
软件包层次结构区域中,因此只需使用该pkg
工具即可查询已安装软件包数据库:
pkg 查询“%o %n-%v %c”| awk '/^shells\// {$1="";print $0;}'
shells/
如果安装了 Fish、rc、v7sh、heirloom-sh 等,这将捕获它们,但也会对层次结构中但本身不是 shell 的包产生一些误报,例如 bash-completion 。
进一步阅读
在 OpenBSD 上
OpenBSD 就像 FreeBSD、TrueOS 等。有一些差异。一个还在运行
猫 /etc/shell查看已批准的 shell 列表,已批准的 shell 和已安装的 shell 之间仍然存在差异。
不过,OpenBSD 有一个较旧的包管理器,以及操作系统本身附带的一组不同的 shell。
在 OpenBSD 上,操作系统本身附带 Korn shell(特别是 pdksh)和 C shell(不是 TENEX C shell),分别作为/bin/sh
(aka /bin/ksh
)和/bin/csh
(not /bin/tcsh
)。
同样,添加到该列表中的第三方 shell 位于shells/
包层次结构区域中,因此查找已安装 shell 的命令是
pkg_info -P -A | pkg_info -P -A | grep '^shells/'
如果安装了 sqlports 软件包,您还可以使用sqlite3
SQL 查询/usr/local/share/sqlports
数据库来查找已安装的 shell 软件包。
进一步阅读
在 Debian、Ubuntu 等上。
同样,可以通过以下方式获得批准的 shell 列表
猫 /etc/shell同样,这与已安装的 shell 列表不同。
在 Debian 和 Ubuntu 上,每一个shell 由包管理器管理。没有“操作系统附带”的 shell。
同样,所有 shell 包都已轻松标记。 APT(高级打包工具)具有“部分”的概念,而不是像 BSD 端口/包世界那样具有层次结构,并且 shell 包位于部分中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
文件。它应该包含有效登录 shell 的列表。