如何使用相同的参数执行多个命令?

我想知道是否有可能在Ubuntu终端中进行链操作,如:

action 1 on objectA . then action 2 on objectA 

无需重复objectA的名称。

例:

 touch file.js && openEditor "$1" 

或类似的东西。

使用bash History Expansion ,您可以使用!#:n eg来引用当前命令行的第n个单词

 $ touch foobar && ls -l !#:1 touch foobar && ls -l foobar -rw-rw---- 1 steeldriver steeldriver 0 Jun 20 14:54 foobar $ touch foo bar && ls -l !#:2 touch foo bar && ls -l bar -rw-rw-r-- 1 steeldriver steeldriver 12 Jun 20 14:58 bar 

常见用例有一个方便的快捷方式。 在你的例子中,你正在做:

 $ touch file.js $ openEditor +<.> 

在第二个命令中,诀窍是编写openEditor (后面有空格),然后是Alt + 。 这将插入最后 一个命令的最后一个参数,即file.js (如果出于某种原因它不能与Alt一起使用, Esc应该也能正常工作。)

由于“对象”通常是上一个命令的最后一个参数,因此可以经常使用。 它易于记忆,并可快速集成到您的直观使用的shell快捷方式集中。

你可以用这一系列做很多事情,这里有一篇关于可能性的深入文章: https : //stackoverflow.com/questions/4009412/how-to-use-arguments-from-previous-command 。

作为奖励,这不仅适用于bash,而且适用于使用libreadline处理命令行输入的所有程序。

对于默认的交互式shell bash和脚本shell dash ,你可以使用$_来调用最后一个命令的最后一个参数 。

 $ echo "Hello World"; echo same "$_" Hello World same Hello World 

csh和tcsh有历史引用,特别是对于命令的最后一个单词,你可以使用!$ ,对于单个参数 – !:

 ~% echo foo bar foo bar ~% echo !$ echo bar bar % echo bar baz bar baz % echo !:1 echo bar bar 

通常,最好将objectA中的任何内容objectA给变量,并在多个命令,循环等中使用它。或者,函数可以是一个选择:

 $ foo(){ echo "$@"; stat --print="%F\n" "$@";} $ foo testdir testdir directory 

我建议不要反对steeldriver的答案给出的历史方法。 这依赖于全球状态,这总是很脆弱。

更好的是使用适当的变量对所有需要的命令进行预先循环:

 $ for c in touch gedit; do $c foo.txt; done 

一般来说,有一点问题是Bash在出现故障时不会中止,即这实际上就像touch foo.txt; gedit foo.txt touch foo.txt; gedit foo.txt而不是用&&链接。 所以,为了安全起见,你可以添加break

 $ for c in touch gedit; do $c foo.txt || break; done 

在烹饪单行时,我有时会将我重复的事物分配给shell变量,我在命令中多次使用它。 我可以回忆和编辑它以使用带有向上箭头的不同arg,控制+ a,控制+右箭头以使光标接近t=

 t=testloop; asm-link -d "$t.asm" && perf stat -r2 ./"$t" 

请注意,这样可以轻松添加扩展名或名称的变体。

还要注意我需要一个; 在变量赋值之后,因为var=value cmd只是将其设置为该命令的环境变量,并且不会影响shell上下文。