这可能在 zsh 手册中,很抱歉我偷懒并在这里询问。zsh 中的 :t 似乎有一些特别之处,如以下示例所示。
% x=foo
% echo $x:bar
foo:bar
% echo $x:toad
foooad
Run Code Online (Sandbox Code Playgroud)
的行为$x:bar
是预期的行为,但:t
似乎退格了。有人可以引导我到手册中讨论此问题的相应部分吗?谢谢!
Fre*_*ddy 12
:t
是一个修饰符
\n\n\n
t [ digits ]
\n删除所有前导路径名组件,留下最后一个组件(尾部)。这类似于 \xe2\x80\x98basename
\xe2\x80\x99。首先删除所有尾随斜杠。十进制数字的处理方式与上面针对\n(h) 的描述相同,但在这种情况下,保留尾随分量的数量\而不是默认的 1;0 的处理方式与 1 相同。
% x=/foo/bar/baz\n% echo $x:toad \nbazoad\n% echo $x:t\nbaz\n% echo ${x:t2}\nbar/baz\n
Run Code Online (Sandbox Code Playgroud)\n(:t
,来自 csh 从 1990 年开始就存在,而该:t2
变体是在 2019 年添加的,首次在版本 5.8 中提供)。
修饰符 \xe2\x80\x93variable:modifier
允许在变量扩展时修改变量。对于您的情况,为了使其更加明显:
echo ${x:t}bar\n
Run Code Online (Sandbox Code Playgroud)\n删除 中的所有前导路径名组件x
。(尝试设置x=/usr/bin/foo
!)
老实说,我尝试训练自己永远不要在字符串 \xe2\x80\x93 中使用“raw” $variable
,并发症的风险太高(x=foo; xy=bar
,echo $xyz
\xe2\x80\xa6);去争取echo ${x}:toad
消除您的 shell 比您想要的更智能的任何风险。