zsh 中 :t 的含义

vdb*_*uss 7 zsh

这可能在 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

t [ digits ]
\n删除所有前导路径名组件,留下最后一个组件(尾部)。这类似于 \xe2\x80\x98 basename\xe2\x80\x99。首先删除所有尾随斜杠。十进制数字的处理方式与上面针对\n(h) 的描述相同,但在这种情况下,保留尾随分量的数量\而不是默认的 1;0 的处理方式与 1 相同。

\n
\n
% 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 中提供)。

\n


Mar*_*ler 6

修饰符 \xe2\x80\x93variable:modifier允许在变量扩展时修改变量。对于您的情况,为了使其更加明显:

\n
echo ${x:t}bar\n
Run Code Online (Sandbox Code Playgroud)\n

删除 中的所有前导路径名组件x。(尝试设置x=/usr/bin/foo!)

\n

老实说,我尝试训练自己永远不要在字符串 \xe2\x80\x93 中使用“raw” $variable,并发症的风险太高(x=foo; xy=barecho $xyz\xe2\x80\xa6);去争取echo ${x}:toad消除您的 shell 比您想要的更智能的任何风险。

\n