[英]How to get script file path inside script itself when called through sym link
當我需要在腳本本身內部獲取腳本文件的路徑時,我使用以下內容:
`dirname $0`
這工作文件,直到我通過sym鏈接調用腳本。 在這種情況下,上面的代碼打印鏈接的位置而不是原始文件。
有沒有辦法獲取原始腳本文件的路徑,而不是鏈接?
謝謝,邁克
if [ -L $0 ] ; then
DIR=$(dirname $(readlink -f $0)) ;
else
DIR=$(dirname $0) ;
fi ;
您真的需要閱讀以下BashFAQ文章:
事實是, $0
黑客攻擊是不可靠的,並且只要應用程序以第0個參數啟動而不是應用程序的路徑,它們就會失敗。 例如, login(1)
將-
在您的應用程序名稱前面-
在$0
,導致破壞,並且每當您調用PATH
$0
的應用程序時,將不包含應用程序的路徑而只包含文件名,這意味着您無法從中提取任何位置信息。 還有很多方法可能會失敗。
底線:不要依賴黑客,事實上你無法弄清楚你的腳本在哪里,所以使用配置選項來設置配置文件的目錄或者你需要腳本的路徑。
使用readlink
:
readlink -f "$0"
Dir=$(dirname $(readlink -f "$0"))
我建議這個:
dirname $(realpath $0)
例:
skaerst@test01-centos7:~/Documents> ../test/path.sh
dirname realpath: /home/skaerst/test
skaerst@test01-centos7:~/Documents> cat ../test/path.sh
#!/bin/bash
echo "dirname realpath: $(dirname $(realpath $0))"
也適用於符號鏈接,因為realpath默認使用-P:
skaerst@test01-centos7:~/Documents> ln -s ../test/path.sh p
skaerst@test01-centos7:~/Documents> ./p
dirname realpath: /home/skaerst/test
我想,realpath可用於coreutils> 8.5
skaerst@test01-centos7:~/Documents> rpm -qf $(which realpath) $(which dirname)
coreutils-8.22-15.el7_2.1.x86_64
coreutils-8.22-15.el7_2.1.x86_64
心連心
問候
斯特凡
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.