Bash

從符號連結執行 bash 腳本。如何更改目錄以使相關目錄工作

  • October 4, 2020

關於情況:

我有一個名為 inside 的符號mycommand連結$PATH。它連結到一個mycommand.sh在別處呼叫的文件。該文件需要另一個文件,我們稱之為mycommand2.sh

somedir
|-mycommand.sh
|-mycommand2.sh

直接執行時./mycommand.sh發現另一個文件。執行mycommand的時候不是。原因:在mycommand.sh另一個文件中稱為./mycommand2.sh.

如何mycommand在不將所有相對目錄更改為絕對目錄的情況下進行工作?

該問題不是由符號連結引起的。

如果mycommand.sh呼叫./mycommand2.sh,它期望它的目前工作目錄是somedir. 目前工作目錄與命令的命名或呼叫方式無關。chdir()它是通過系統呼叫或cdshell 中的內置命令設置的程序屬性。

如果你這樣做了:

cd /path/to/somedir
mycommand

mycommandakamycommand.sh仍然會./mycommand2.sh在目前目錄中找到。

無論mycommand.shmycommand2.sh哪個工作目錄中呼叫它,都需要對其進行修改,例如:

#! /bin/sh -
mydir=$(dirname -- "$0")
"${mydir%/}/mycommand2.sh"

或者如果mycommand.sh確實需要它的工作目錄是somedir

#! /bin/sh -
mydir=$(dirname -- "$0")
CDPATH= cd -P -- "$mydir" || exit

./mycommand2.sh

那是當使用符號連結會導致問題時,就像呼叫 as 一樣mycommanddirname -- "$0"會返回mycommand符號連結的目錄名,而不是mycommand.sh腳本的目錄名。

要解決它,您將修改mycommand.sh為:

#! /bin/sh -
mydir=$(dirname -- "$(readlink -f -- "$0")")
"${mydir%/}/mycommand2.sh"

Where readlink -f(不是標準命令,但很常見)將解析所有符號連結。假設mycommand.sh它本身不是指向不同目錄中腳本的符號連結。

如果您不能或不想修改該腳本,另一種方法是創建一個mycommand 腳本而不是符號連結

#! /bin/sh -
cd /path/to/somedir &&
 exec ./mycommand.sh "$@"

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