我正在運行此 zsh 腳本,但收到以下錯誤訊息:
./executable: unrecognized modifier `P'
腳本程式碼如下:
#!/bin/zsh
setopt no_unset err_exit pipe_fail
if [[ $# -lt 2 ]]; then
cat <<EOF
Usage: ${0:t} something1 something2 ..
EOF
exit 1
fi
foobar=${argv[1]:P}
我知道這個錯誤與 foobar 分配有關,但我找不到它的P
用途,也找不到為什麼它有用。有任何想法嗎?
答案1
可能嘗試替換為
foobar=$(readlink -f ${argv[1]})
僅當檔案存在時才有效,而 :P 不需要。
答案2
:P
Zsh中新增了修改器5.3版本,因此在舊版本中不可用。一種類似但不完全相同的方法是使用:A
修飾符代替。
從zshexpn(1)
:
修飾符:a
將檔案名稱轉換為絕對路徑:如有必要,請在前面新增目前目錄;消除 '。路徑段;並刪除“..”路徑段以及緊鄰它們之前的段。
修飾符:A
像「a」修飾符一樣將檔案名稱轉換為絕對路徑,然後將結果傳遞給 realpath(3) 函式庫函數來解析符號連結。
注意:在沒有 realpath(3) 函式庫函數的系統上,不會解析符號鏈接,因此在這些系統上 'a' 和 'A' 是等效的。
注意: foo:A 和 realpath(foo) 在某些輸入上是不同的。有關 realpath(foo) 語義,請參閱
P
修飾符。
修飾符:P
將檔案名稱轉換為絕對路徑,如 realpath(3)。產生的路徑將是絕對路徑,沒有“.”也不是“..”元件,並引用與輸入檔名相同的目錄條目。
與 realpath(3) 不同,允許並保留不存在的尾隨元件。
我省略了一些更無關的細節,所以一定要檢查手冊頁; “歷史擴展”部分的“修改器”小節。