Shell
通過符號連結從包含腳本本身的目錄執行 shell 腳本
我的願望是不要更改目錄然後執行。我使用一個 jar 文件並且需要執行它。所以我做了一個非常基本的shell腳本來做到這一點。
#!/bin/sh java -jar TreeForm.jar
然後,我將其保存為
TreeForm
,而不是TreeForm.sh
。接下來,我創建了一個符號連結,如下所示:ln -s /opt/TreeForm/TreeForm /usr/bin/ chmod +x /opt/TreeForm/TreeForm
它已成功創建。但是,當我執行時,我從 JAVA 獲取以下錯誤。
錯誤:無法訪問 jarfile TreeForm.jar
因此,shell 腳本似乎沒有執行自己的目錄或不查看該目錄,而是在目前目錄中執行。我真的不想修改我的腳本文件,給出完整路徑
TreeForm.jar
。所以我想問一下,有沒有辦法在不更改目前路徑或添加PATH
變數路徑的情況下找到相對於腳本文件的文件?或者是否有任何具有腳本路徑的變數,而不是目前的?
除非您告訴它,否則 shell 不會更改到另一個目錄。如果您希望您的腳本在不同的目錄中執行命令,請
cd
從您的腳本中呼叫。腳本的路徑以
"$0"
. 如果腳本是符號連結,那就是符號連結的路徑。如果您想獲得符號連結的最終目標,請呼叫realpath
(在大多數但不是所有現代 unice 上可用;在 Linux(GNU 和 BusyBox)、FreeBSD 和 Solaris 11 上可用,但在 OSX 上不可用)。cd "$(dirname "$(realpath "$0")")"
realpath
是 GNU coreutils 的一個相對較新的補充;如果您的版本太舊,您可以使用readlink -f
較舊的版本。對於非 GNU 系統,如果realpath
不存在,則readlink
可能存在,但它通常只查看一級符號連結,大多數readlink
實現沒有-f
選擇進行完整解析。