如何轻松找到什么变体在我的发行版中使用?

如何轻松找到什么变体在我的发行版中使用?

当学习在终端、shell 等中使用基本 C 函数和其他命令(sed、awk 等)时,我意识到它们的行为根据操作系统的不同而略有不同。 MacOS、Linux 和 BSD 之间存在细微的差异,由于 GNU 扩展以及开发人员的安全强化,不同的发行版也存在细微的差异。不挖几十个网页怎么知道我的系统用的是什么版本?

man没有帮助。例如man printf状态NOTE: your shell may have its own version of printf, which usually supersedes the version described here. Please refer to your shell's documentation for details about the options it supports.

答案1

大多数命令都有一些选项,您可以使用它们来输出您正在查找的信息。你提到sed,awk,尝试使用 --version 参数:

Tux ~ $ awk --version
awk --version
GNU Awk 5.1.1, API: 3.1

请注意,专用选项可能并不总是版本yourcommand -h通常应该告诉您,如果没有请参阅联机帮助页。

就此而言,您正确地写了存在一个问题,某些 shell 内置命令通常printf不会产生任何信息:

Tux ~ $ printf --version
bash: printf: --: invalid option
printf: usage: printf [-v var] format [arguments]

尽管在联机帮助页中写道打印函数遵循 --version 参数。
您可以从中推断出您正在使用内置的打印函数功能,而不是附带的功能核心工具包,版本,您可以使用触发其完整路径:

Tux ~ $ which printf
/usr/bin/printf
Tux ~ $ /usr/bin/printf --version
/usr/bin/printf --version
printf (GNU coreutils) 8.32
Packaged by Gentoo (8.32-r1 (p0))

答案2

在大多数类似 Bourne 的 shell 中,

type cmd

(与 相同command -V cmd)将告诉您 shell 将解释cmd为:

bash-5.2$ type time
time is a shell keyword

time那种情况下的语法是 shell 语法中的一个单词,你就跑去info bash time了解更多关于它的知识。

zsh$ type ls
ls is a shell function from /home/stephane/.zshrc

ls被重新定义为我的 shell 启动文件中的函数。您可以在 中使用functions ls/typeset -f lswhich ls( 的缩写whence -c ls)查看其定义zsh

ksh$ type r
r is an alias for 'hist -s'

在 ksh93、zsh 或 bash 中,type -a cmd可以更进一步告诉您cmd它可以在关键字、别名、函数、内置函数和可执行文件$PATH(和/或可执行文件的哈希表中)中发现的所有变体。

bash-5.2$ type -a time
time is a shell keyword
time is /usr/bin/time
time is /bin/time
zsh$ mac:~$ type -a echo
echo is a shell builtin
echo is /home/stephane/bin/echo
echo is /bin/echo

在 tcsh shell 中,您可以使用which cmd它提供更多详细信息type(也适用于 zsh,zshwhich也支持该-a选项)。

对于在文件系统中作为可执行文件找到的命令的变体,有时您可能会在以下情况下找到多个变体:

  • 作为某些第三方软件的一部分安装了一个变体。就像在 macOS 上通过自制程序一样。
  • 系统支持多种标准,并允许您通过设置来选择在您的环境中符合哪些标准,$PATH就像在 Solaris 上一样,您可以安装一些 XPG4 或 XPG6 模块以启用 POSIX 合规性(其不同版本),并且/usr/xpg6/bin可以/usr/xpg4/bin提前/bin获得$PATH标准可执行文件的版本。man standards将告诉您如何获取他们的文档。
  • 您自己在具有写入权限的目录中安装了一些变体,例如~/bin并将其添加到$PATH.
  • 系统管理员在本地安装了一个变体,如/usr/local/bin.

在这些情况下,$MANPATH也可能已更新以man在相关目录中查找文档。man -a可以调出某个主题的所有手册页。

在 Debian 及其衍生版本上,可以使用可用命令的替代实现。例如,您可以locate从 GNU findutils 或 mlocate 或 plocate 获取命令。如果安装了多个软件包,系统管理员可以运行命令update-alternatives来选择默认使用的软件包,其他替代方案仍然可以通过不同的名称(例如locate.findutils)调用,并且始终可以通过其他名称访问手册页姓名。

运行可以看到详细信息update-alternatives --display。例如

$ update-alternatives --display locate
locate - auto mode
  link best version is /usr/bin/plocate
  link currently points to /usr/bin/plocate
  link locate is /usr/bin/locate
  slave locate.1.gz is /usr/share/man/man1/locate.1.gz
  slave updatedb is /usr/bin/updatedb
  slave updatedb.1.gz is /usr/share/man/man1/updatedb.1.gz
  slave updatedb.8.gz is /usr/share/man/man8/updatedb.8.gz
/usr/bin/locate.findutils - priority 20
  slave locate.1.gz: /usr/share/man/man1/locate.findutils.1.gz
  slave updatedb: /usr/bin/updatedb.findutils
  slave updatedb.1.gz: /usr/share/man/man1/updatedb.findutils.1.gz
/usr/bin/plocate - priority 90
  slave locate.1.gz: /usr/share/man/man1/plocate.1.gz
  slave updatedb: /usr/sbin/updatedb.plocate
  slave updatedb.8.gz: /usr/share/man/man8/updatedb.plocate.8.gz

相关内容