Shell

通過符號連結從包含腳本本身的目錄執行 shell 腳本

  • March 19, 2016

我的願望是不要更改目錄然後執行。我使用一個 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選擇進行完整解析。

引用自:https://unix.stackexchange.com/questions/270917