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

この: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)とは異なり、存在しない末尾のコンポーネントは許可され、保持されます。

より無関係な詳細のいくつかは省略したので、マニュアル ページの「履歴の拡張」セクションの「修飾子」サブセクションを必ず確認してください。

関連情報