假设我有命令A
和命令,B
但我想B
在键入时运行,A
反之亦然。我试过了
alias A='B'
alias B='A'
Run Code Online (Sandbox Code Playgroud)
但这似乎出于某种原因不起作用。
我该怎么做呢?
编辑:
命令B
实际上已在 my 中定义为函数.bashrc
,因此
alias A='command B'
alias B='command A'
Run Code Online (Sandbox Code Playgroud)
没有按照建议工作。
我想我可以更新的问题说,A
而且B
也可能是在bash定义的功能。
因此,您可以明确了解 shell 以几种不同的方式定位命令的方式。您可以使用...
command command_name
Run Code Online (Sandbox Code Playgroud)
...指示 shell 仅调用command_name如果它是$PATH
d 可执行文件。这在像您这样的情况下很重要,因为当您完成alias A
时alias B
,指的是alias A
通常指的是在alias
扩展退出递归之前的 20 次之类的事情- 并且您会立即回到开始的地方。如果你只想在调用时调用$PATH
d 可执行文件B
,A
反之亦然,你可以这样做......
alias A='command B' B='command A'
Run Code Online (Sandbox Code Playgroud)
...甚至应该避免调用名为A
or 的函数B
。否则 - 因为 shell 不会将引用的扩展alias
为 analias
但仍然会调用一个函数,即使它的command_name被引用,你可以引用A
和B
在像...
alias A=\\B B=\\A
Run Code Online (Sandbox Code Playgroud)
好的,所以它不会递归二十次。我可以发誓我在某些man
页面上读过它,但我想至少不是这样的bash
or ksh
(到目前为止只测试了它们中的一个)。事实上,它只递归两次:
n=0
A(){ echo not B; n=0; }
B(){ echo not A; n=0; }
alias A='echo "$((n+=1))";B' B='echo "$((n+=1))";A'
Run Code Online (Sandbox Code Playgroud)
如果我执行上述操作并执行...
A
Run Code Online (Sandbox Code Playgroud)
...在bash
它打印:
1
2
not B
Run Code Online (Sandbox Code Playgroud)
我想这与bash
手册中的有关:
ls
来ls -F
,例如,和bash
不会尝试递归扩展替换文本。我之前读过,但我认为这样做时不会测试导致当前扩展的所有扩展 - 我认为它仅适用于链中的最新扩展。无论如何,这似乎是原因。
尽管如此,我确实注意到了一些有趣的行为。在我已经声明了别名和函数之后,我去重新运行命令,但中间的空白少了一点 - 像这样:
A(){ echo not B; }; B(){ echo not A; }; A; B
Run Code Online (Sandbox Code Playgroud)
……那确实……
1
2
3
4
5
6
not B
7
8
not A
Run Code Online (Sandbox Code Playgroud)
这意味着 shell 用别名内容替换了函数名——这不是人们通常期望发生扩展的位置——做了echo
s 并且仍然重新定义然后执行函数。
归档时间: |
|
查看次数: |
776 次 |
最近记录: |