获取命令的规范路径

myt*_*hic 7 shell bash symlink

我正在编写一个需要某些命令的规范路径的脚本。由于可能存在指向实际命令的符号链接,因此我readlink -f用来获取规范路径。但是我没有得到我真正想要的东西readlink -f,我将用下面的例子来解释:

假设我当前的目录是:/home/user/Documents 如果我尝试获取sleepwith的路径,readlink -f我会得到这个:

/home/user/Documents/sleep
Run Code Online (Sandbox Code Playgroud)

我真正想要的是 /bin/sleep

PSk*_*cik 3

readlink -f "$(type -P sleep)"
Run Code Online (Sandbox Code Playgroud)

或者如果您注重绩效:

cpath="$(type -P sleep)"; [ ! -L "$cpath" ] || cpath="$(readlink -f "$cpath")"
Run Code Online (Sandbox Code Playgroud)

使用readlink -e(existing) 代替readlink -f可以避免这种操作不存在文件的事故。

第二个示例假设返回的路径type -P是规范的,这意味着它假设您的路径没有非规范组件。

  • `[!-L "$cdpath" ]` 并不能保证该路径是规范的,甚至是绝对的。该路径仍然可以是相对的,并且另一个组件(但最后一个)可能是符号链接。 (3认同)
  • 请注意“which”有很多问题。标准命令是“command -v”(尽管会返回那些内置命令的命令名称)。 (3认同)