是否有可能在/ usr/local/bin文件夹中执行符号链接的文件,以获取原始脚本的绝对路径?好吧,..我知道原始文件在哪里,我知道它因为我正在链接它.但是,即使我移动原始源代码(和符号链接),我希望这个脚本正常工作.
#!/bin/bash
echo "my path is ..."
Run Code Online (Sandbox Code Playgroud)
koj*_*iro 18
readlink不是标准命令,但它在Linux和BSD上很常见,包括OS X,它是您问题最直接的答案.BSD和GNU readlink实现是不同的,所以请阅读您所拥有的文档.
如果readlink不可用,或者您需要编写未绑定到特定实现的跨平台脚本:
如果符号链接也是一个目录,那么
cd -P "$symlinkdir"
Run Code Online (Sandbox Code Playgroud)
会让你进入dereferenced目录,所以
echo "I am in $(cd -P "$symlinkdir" && pwd)"
Run Code Online (Sandbox Code Playgroud)
将回显完全取消引用的目录.也就是说,cd -P取消引用整个路径,因此如果在同一路径中有多个符号链接,则可能会产生意外结果.
如果符号链接是文件而不是目录,则可能不需要取消引用该链接.大多数命令都无害地遵循符号链接.如果您只想检查文件是否是链接,请使用test -L.
假设我们有真实的脚本或文件以及指向它的符号链接:
$ ls -la
-rwxr-xr-x 1 root root 0 Mar 20 07:05 realscript.sh
lrwxrwxrwx 1 root root 10 Mar 20 07:05 symlink -> realscript.sh
Run Code Online (Sandbox Code Playgroud)
GNU coreutils的一部分是一些非常有用的命令:
$ realpath symlink
/home/test/realscript.sh
Run Code Online (Sandbox Code Playgroud)
另请参见原件:
realpath realscript.sh
/home/test/realscript.sh
Run Code Online (Sandbox Code Playgroud)
在脚本中也很好的组合是用于dirname保存
$ dirname /home/test/realscript.sh
/home/test
Run Code Online (Sandbox Code Playgroud)
总结一下,可以在脚本中使用
echo $( dirname $(realpath "symlink") )
Run Code Online (Sandbox Code Playgroud)
或获取并存储在可变的真实脚本主目录中:
script_home=$( dirname $(realpath "$0") )
echo Original script home: $script_home
Run Code Online (Sandbox Code Playgroud)
为了测试所有内容,我们将symlink放在/ home / test2 /中,修改一些其他内容,然后从根目录运行/调用它:
/$ /home/test2/symlink
/home/test
Original script home: /home/test
Original script is: /home/test/realscript.sh
Called script is: /home/test2/symlink
Run Code Online (Sandbox Code Playgroud)
请尝试将修改后的输出写给自己:)