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

时间:2011-12-30 17:12:07

标签: scripting bash

cd $(dirname $(readlink -f $0))

它是一个更大的脚本文件的一部分,但是在#!/ bin / bash

之后的最开始出现

3 个答案:

答案 0 :(得分:6)

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

我之前使用过这种变体,location=$(dirname $0)。这不会更改目录,而是存储脚本的路径以供以后使用。 dirname $0接受一个文件名(在这种情况下,$ 0或shell找到该文件的路径),echo es存储它的目录。包装命令(或一系列命令)在$()组合中导致命令的输出(通过echodfcat等打印到屏幕上的任何内容)使用$()替换该表达式。 例: variable=$(echo "test")variable="test"

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

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

答案 1 :(得分:4)

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

请参阅:

  • man readlink
  • man dirname
  • man cd

答案 2 :(得分:2)

添加到@ user606723:$0包含调用脚本 1 的路径和/或文件名。 readlink -f $0将使该路径成为绝对路径,并且还将解析此名称中的所有符号链接 - 中间目录和最终部分。从那部分dirname将只返回目录部分。

这是为应用程序编写“启动脚本”的好方法。该脚本可以从某个私有bin目录进行符号链接,该脚本不会假定该应用程序的某个安装位置。

<小时/> 1 关于$0的内容的详细信息,当它是绝对的,何时是,当它包含路径时,等等取决于调用的方式 shell找到了脚本。这些评论对此有所启发。