簡體   English   中英

當通過sym鏈接調用時,如何在腳本本身內獲取腳本文件路徑

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM