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

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

如何展示每一个安装了命令行 shell,(即bash,,zshETC。),没有重复项,也没有其他内容(即没有不是 shell 的程序)?这段代码几乎适用于我的卢本图系统,(有dashkshzshcshyash,但打印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 。

进一步阅读

  • 贝壳/FreeBSD 端口树。 freebsd.org。
  • pkg-queryFreeBSD手册。 2015.freebsd.org。

在 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 软件包,您还可以使用sqlite3SQL 查询/usr/local/share/sqlports数据库来查找已安装的 shell 软件包。

进一步阅读

  • 贝壳/OpenBSD 端口树。 ports.su。
  • pkg_infoOpenBSD 手册。 2016.openbsd.org。

在 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 的列表。

相关内容