Bash:有谁可以弄清楚这条线的含义?

1 bash scripting

cd $(dirname $(readlink -f $0))
Run Code Online (Sandbox Code Playgroud)

它是一个更大的脚本文件的一部分,但是在#!/ bin/bash之后的最开始出现

Ale*_*ebr 6

这似乎会将shell的工作目录更改为存储脚本的目录.这可能是为了使脚本可以引用与其自身相同的目录中的其他内容.

我以前用过这个变种,location=$(dirname $0).这不会更改目录,而是存储脚本的路径以供以后使用.dirname $0获取文件名(在这种情况下,$ 0或shell找到该文件的路径),以及echo存储它的目录.在$()组合中包装命令(或一系列命令)会导致命令的输出(无论被打印至屏幕通过echo,df,cat,等等)使用,以取代表达$().示例: variable=$(echo "test") 变成 variable="test"

与其他编程语言一样,$()可以嵌套.一个例子是: variable=$(echo $(echo "test")) 最内层表达式将打印'test',然后将其替换为最外层的参数echo.echo然后将其输出替换为要存储的值variable- 第一个和第二个示例的结果将是相同的.一个愚蠢的例子.但它的确有效.

唯一的不同之间$(dirname $(readlink -f $0))$(dirname $0),我可以看到的是,前者总是返回绝对路径.后者可以返回相对路径或绝对路径,具体取决于工作目录相对于脚本的位置.


use*_*723 5

  • 该命令readlink -f $0确实返回了一个路径
  • dirname采用该路径,并为您提供目录名
  • cd将目录更改为该目录名
  • $0是一个变量,保存当前脚本被调用时的名称。

看:

  • man readlink
  • man dirname
  • man cd