csh 别名中的 \!^ 有何作用

csh 别名中的 \!^ 有何作用

注意:我的shell是csh

一位前同事给了我以下命令,将其放入我的.cshrc

alias bastion 'ssh -L \!^\:<some_ip_address> <username>@<something.com>'

请注意,<> 之间的内容是实际值。

现在,当我在 shell 上运行此命令时,出现以下错误:Bad ! arg selector.

我一直在网上搜索 的类似用法,ssh -L但没有找到使用\!^\在 前面使用 的语法的示例:

知道这个命令实际上想要做什么以及为什么它不起作用吗?

答案1

我自己不是 csh 用户,但这似乎是历史控制。

!^给出前一个命令的第一个参数。这与 相同!:1。请记住,正如^(插入符号) 是正则表达式中的行首锚点 (26.4) 一样,!^给出了开始历史参数。

% cat fn fn1 fn2
 ...
% more !^
more fn

https://docstore.mik.ua/orelly/unix/upt/ch11_07.htm

\(我假设)是转义,以防止过早!^被解释(即不是在定义别名时而是在使用别名时)。查看示例这里

所以这基本上实现了别名的参数处理。别名旨在使用要绑定的本地端口号来调用。

$ bastion 8080 
# should be executed as
$ ssh -L 8080:<some_ip_address> <username>@<something.com>

$ bastion 8080 some argument
# is probably (I'm still no csh user) executed as
$ ssh -L 8080:<some_ip_address> <username>@<something.com> some argument

作为结论,我假设Bad ! arg selector.意味着没有可供选择的参数,因为您尝试在bastion没有端口参数的情况下运行它。


1我假设您的替代品<some_ip_address>实际上是 IP + 端口?不然这个-L论点就有点奇怪了。

相关内容