zsh 腳本中無法辨識的修飾符 P

zsh 腳本中無法辨識的修飾符 P

我正在運行此 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

:PZsh中新增了修改器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) 不同,允許並保留不存在的尾隨元件。

我省略了一些更無關的細節,所以一定要檢查手冊頁; “歷史擴展”部分的“修改器”小節。

相關內容