![zsh 脚本中无法识别的修饰符 P](https://linux22.com/image/1552497/zsh%20%E8%84%9A%E6%9C%AC%E4%B8%AD%E6%97%A0%E6%B3%95%E8%AF%86%E5%88%AB%E7%9A%84%E4%BF%AE%E9%A5%B0%E7%AC%A6%20P.png)
我正在运行这个 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) 不同,允许并保留不存在的尾随组件。
我省略了一些无关紧要的细节,因此请务必检查手册页;“历史扩展”部分,小节“修饰符”。