我需要PATH
使用shell脚本找到给定程序的路径。该路径必须是程序的实际完整路径,以后可以传递给其中一个exec*
不搜索PATH
自身的函数,例如execv
。
有类似的程序kill
,它们既可以作为实际程序使用,又可以内置于外壳中。如果是这种情况,我需要实际程序的完整路径。
PATH
如2.9.1.1节,POSIX标准的命令搜索和执行中所指定,有许多实用程序可以在上找到程序。
有which
,这不是任何标准的一部分。在某些系统上,它可以是常规程序,而在某些shell中,它是内置的。它似乎在大多数系统和Shell上都可用,但是具有内置版本的Shell也仅返回内置名称而不是可执行文件的路径。同样,它没有以任何方式标准化,并且可能返回任何输出并采用不同的选项。
bash# which kill
/usr/bin/kill
dash# which kill
/usr/bin/kill
fish# which kill
/usr/bin/kill
mksh# which kill
/usr/bin/kill
tcsh# which kill
kill: shell built-in command.
zsh# which kill
kill: shell built-in command
有whence
,这是一些shell的内置组件。但是在许多外壳上不可用。它也将返回内置名称而不是程序路径。-p
可以将A 传递给wherece以更改此行为。
bash# whence kill
bash: whence: command not found
dash# whence kill
dash: 1: whence: not found
fish# whence kill
fish: Unknown command 'whence'
mksh# whence kill
kill
mksh# whence -p kill
/usr/bin/kill
tcsh# whence kill
whence: Command not found.
zsh# whence kill
kill
zsh# whence -p kill
/usr/bin/kill
有command
POSIX:2008指定的内置函数。不幸的是,它还会搜索常规命令和内置程序,并将返回内置程序的名称,而不是由相同名称的内置程序隐藏的程序路径。一些旧的shell尚未实现它。
bash# command -v kill
kill
dash# command -v kill
kill
fish# command -v kill
/usr/bin/kill
mksh# command -v kill
kill
tcsh# command -v kill
command: Command not found.
zsh# command -v kill
kill
并有
—
IPOR Sircer
realpath
@Muzer在在我手上弹我,
—
塞巴斯蒂安·施拉德
enable
只提供bash
和zsh
您需要一个针对特定外壳的可实现方法,该特定外壳正在针对所有外壳运行脚本。脚本不是由随机shell执行的,而是由shebang行中指定的shell执行的。话虽这么说,那将是……
—
AlexP
type -p
。bash和dash都可以让您说出一个command
命令来运行实际的可执行文件,即使有一个函数或内建函数具有相同的名称。
command
正如Q正确指出的那样,@AlexP会跳过函数(和别名),但不会内置函数。而且,您不能总是使用shebang,因为在所有系统上都没有路径可以获取任何给定的Shell,甚至某些POSIX Shell。
enable
在POSIX中指定了,但是如果指定了,则可以enable -n which
禁用内置的shellwhich
。