如何在bash中交换两个命令?

tex*_*ood 4 bash alias

假设我有命令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定义的功能。

mik*_*erv 5

因此,您可以明确了解 shell 以几种不同的方式定位命令的方式。您可以使用...

command command_name
Run Code Online (Sandbox Code Playgroud)

...指示 shell 仅调用command_name如果它是$PATHd 可执行文件。这在像您这样的情况下很重要,因为当您完成alias Aalias B,指的是alias A通常指的是在alias扩展退出递归之前的 20 次之类的事情- 并且您会立即回到开始的地方。如果你只想在调用时调用$PATHd 可执行文件BA反之亦然,你可以这样做......

alias A='command B' B='command A'
Run Code Online (Sandbox Code Playgroud)

...甚至应该避免调用名为Aor 的函数B。否则 - 因为 shell 不会将引用的扩展alias为 analias但仍然会调用一个函数,即使它的command_name被引用,你可以引用AB在像...

alias A=\\B B=\\A
Run Code Online (Sandbox Code Playgroud)

好的,所以它不会递归二十次。我可以发誓我在某些man页面上读过它,但我想至少不是这样的bashor 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手册中的有关:

  • 替换文本的第一个单词会测试别名,但与被扩展的别名相同的单词不会被第二次扩展。这意味着,一个可能的别名lsls -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 用别名内容替换了函数名——这不是人们通常期望发生扩展的位置——做了echos 并且仍然重新定义然后执行函数。