Shell-Script
獲取腳本絕對路徑的便攜方式?
(zsh)腳本確定其絕對路徑的可移植方式是什麼?
在 Linux 上,我使用類似的東西
mypath=$(readlink -f $0)
…但這不是攜帶式的。(例如,
readlink
在 darwin 上不辨識-f
標誌,也沒有任何等價物。)(此外readlink
,不可否認,使用這個是一個看起來相當晦澀的黑客。)什麼是更便攜的方式?
,
zsh
它只是:mypath=$0:A
現在對於其他 shell,雖然
realpath()
和readlink()
是標準函式(後者是系統呼叫),realpath
但readlink
不是標準命令,儘管某些系統具有一個或另一個或兩者俱有各種行為和功能集。通常,為了可移植性,您可能需要求助於
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