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) 不同,允许并保留不存在的尾随组件。

我省略了一些无关紧要的细节,因此请务必检查手册页;“历史扩展”部分,小节“修饰符”。

相关内容