如何获取其中的目录路径的Bash脚本位于,里面那个脚本?
例如,假设我想使用Bash脚本作为另一个应用程序的启动器.我想将工作目录更改为Bash脚本所在的目录,因此我可以对该目录中的文件进行操作,如下所示:
$ ./application
我有一个Bash脚本需要知道它的完整路径.我试图找到一种广泛兼容的方式来做到这一点,而不会结束相对或时髦的路径.我只需要支持Bash,而不是sh,csh等.
到目前为止我发现了什么:
从地址中获取Bash脚本的源目录的接受答案是获取脚本的路径dirname $0
,这很好,但可能会返回相对路径(如.
),如果要更改目录中的目录,这是一个问题脚本并使路径仍指向脚本的目录.不过,dirname
将成为这个难题的一部分.
对OS X的Bash脚本绝对路径 的接受答案(特定于OS X,但答案无论如何)都会给出一个函数,该函数将测试是否$0
看起来相对,如果是,则会预先挂起$PWD
.但是结果仍然可以包含相对位(虽然总体来说它是绝对的) - 例如,如果脚本t
在目录中/usr/bin
并且你进入/usr
并且你输入bin/../bin/t
它来运行它(是的,那是复杂的),你最终会得到/usr/bin/../bin
as脚本的目录路径.哪个有效,但......
此页面上的readlink
解决方案如下所示:
# Absolute path to this script. /home/user/bin/foo.sh
SCRIPT=$(readlink -f $0)
# Absolute path this script is in. /home/user/bin
SCRIPTPATH=`dirname $SCRIPT`
Run Code Online (Sandbox Code Playgroud)
但是readlink
不是POSIX,显然解决方案依赖于GNU readlink
,其中BSD由于某种原因无法工作(我无法访问类似BSD的系统进行检查).
所以,各种方式,但他们都有他们的警告.
什么是更好的方式?"更好"的意思是:
在Linux上,该readlink
实用程序接受一个-f
跟随其他链接的选项.这似乎不适用于Mac和可能基于BSD的系统.相当于什么?
这是一些调试信息:
$ which readlink; readlink -f
/usr/bin/readlink
readlink: illegal option -f
usage: readlink [-n] [file ...]
Run Code Online (Sandbox Code Playgroud) 我的bash脚本中有以下代码.现在我想在POSIX中使用它.那么如何转换呢?谢谢.
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" > /dev/null && pwd )"
Run Code Online (Sandbox Code Playgroud) 如何引用shell脚本中的当前目录?
所以我有这个脚本调用同一目录中的另一个脚本:
#! /bin/sh
#Call the other script
./foo.sh
# do something ...
Run Code Online (Sandbox Code Playgroud)
为此,我得到了 ./foo.sh: No such file or directory
所以我改成了:
#! /bin/sh
#Call the other script
foo.sh
# do something ...
Run Code Online (Sandbox Code Playgroud)
但是这会调用foo
默认情况下在PATH中的脚本.这不是我想要的.
所以问题是,./
在shell脚本中引用的语法是什么?
我是Windows和Linux的长期用户,并且在Mac OS X上编写shell脚本有一些奇怪的经历.特别是,我可以编写脚本并从终端运行它们,但每次我尝试从Finder运行一个它始终从用户的主目录而不是脚本所在的目录执行.也就是说,如果脚本位于
~/path/to/the/script.sh
Run Code Online (Sandbox Code Playgroud)
它总是耗尽~
.在过去,我不得不问我更多精通Mac的朋友如何解决这个问题,并且他们经常使用一些非常糟糕的技术来做到这一点,但我认为没有任何理由可以解决这个问题.
我的问题是 - 有没有一种简单的方法可以在Mac OS X中编写一个shell脚本,当在Finder中双击时,它会用完它所在的目录?