Shell-Script

獲取腳本絕對路徑的便攜方式?

  • January 26, 2022

(zsh)腳本確定其絕對路徑的可移植方式是什麼?

在 Linux 上,我使用類似的東西

mypath=$(readlink -f $0)

…但這不是攜帶式的。(例如,readlink在 darwin 上不辨識-f標誌,也沒有任何等價物。)(此外readlink,不可否認,使用這個是一個看起來相當晦澀的黑客。)

什麼是更便攜的方式?

zsh它只是:

mypath=$0:A

現在對於其他 shell,雖然realpath()readlink()是標準函式(後者是系統呼叫),realpathreadlink不是標準命令,儘管某些系統具有一個或另一個或兩者俱有各種行為和功能集。

通常,為了可移植性,您可能需要求助於perl

abs_path() {
 perl -MCwd -le '
   for (@ARGV) {
     if ($p = Cwd::abs_path $_) {
       print $p;
     } else {
       warn "abs_path: $_: $!\n";
       $ret = 1;
     }
   }
   exit $ret' "$@"
}

與(GNU )readlink -f相比,它的行為更像 GNU ,因為如果文件不存在,只要它的目錄名存在,它就不會抱怨。realpath()``readlink -e

在 zsh 中,您可以執行以下操作:

mypath=${0:a}

或者,要獲取腳本所在的目錄:

mydir=${0:a:h}

請參閱有關歷史擴展修飾符的 Zsh 文件,如果安裝了 Info 文件,則在本地可見man zshexpn或隨同。info -f zsh -n Modifiers

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