Bash
從符號連結執行 bash 腳本。如何更改目錄以使相關目錄工作
關於情況:
我有一個名為 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()
它是通過系統呼叫或cd
shell 中的內置命令設置的程序屬性。如果你這樣做了:
cd /path/to/somedir mycommand
mycommand
akamycommand.sh
仍然會./mycommand2.sh
在目前目錄中找到。無論
mycommand.sh
從mycommand2.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 一樣
mycommand
,dirname -- "$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 "$@"