cd $(dirname $(readlink -f $0))
它是一个更大的脚本文件的一部分,但是在#!/ bin / bash
之后的最开始出现答案 0 :(得分:6)
这似乎会将shell的工作目录更改为存储脚本的目录。这可能是为了使脚本可以引用与其自身相同的目录中的其他内容。
我之前使用过这种变体,location=$(dirname $0)
。这不会更改目录,而是存储脚本的路径以供以后使用。 dirname $0
接受一个文件名(在这种情况下,$ 0或shell找到该文件的路径),echo
es存储它的目录。包装命令(或一系列命令)在$()
组合中导致命令的输出(通过echo
,df
,cat
等打印到屏幕上的任何内容)使用$()
替换该表达式。
例:
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找到了脚本。这些评论对此有所启发。