获取脚本执行的目录名称
在编写脚本时,有时需要获取脚本所在的目录名。然而,获取脚本所在目录名的方法并不直观,因此需要找到解决方法。
一种解决方法是使用realpath
命令。如果已经安装了realpath
,可以通过以下命令获取脚本所在的目录名:$(dirname $(realpath $0))
。
这个方法的原理是首先使用realpath
命令获取脚本的绝对路径,然后使用dirname
命令获取该路径的父目录名。
这个方法的优点是简单易懂,只需要一行命令即可获取脚本所在的目录名。然而,它的缺点是需要依赖realpath
命令,如果没有安装realpath
,则无法正常使用。
因此,如果没有安装realpath
,可以考虑其他解决方法。
在上述内容中,作者提出了一个更简单的解决方案来获取脚本执行的目录名称。通过使用以下命令可以实现:
dirname $(readlink -f $0)
作者在Ubuntu 14.04上进行了测试,并提供了一个示例来解释这个解决方案的工作原理。在示例中,which java
命令返回/usr/bin/java
,这是一个符号链接。然后,通过运行readlink -f `which java`
命令,可以获取到实际的Java可执行文件路径:/usr/lib/jvm/java-8-oracle/jre/bin/java
。最后,通过运行dirname $(readlink -f `which java`)
命令,可以获取到包含"java"的文件夹路径:/usr/lib/jvm/java-8-oracle/jre/bin
。这就是脚本所在的目录。
这是作者最终采用的解决方案,因为它更简单,并且适用于符号链接或文件。
原因:在编写脚本时,有时需要获取脚本所在的目录路径,以便在脚本中执行相关操作。然而,脚本所在的目录路径并不直接可用,需要经过一些处理才能获取。
解决方法:下面的代码可以获取脚本所在的目录路径。
if [ -L $0 ] ; then ME=$(readlink $0) else ME=$0 fi DIR=$(dirname $ME)
解析:
- 首先,通过判断`$0`是否是一个符号链接来决定如何处理。如果是符号链接,则使用`readlink`命令获取真实路径并赋值给变量`ME`;如果不是符号链接,则直接将`$0`的值赋给`ME`。
- 然后,使用`dirname`命令获取`ME`的目录部分,并赋值给变量`DIR`。
这样,变量`DIR`就存储了脚本所在的目录路径,可以在脚本中使用。