如何使用相同的参数执行多个命令?
我想知道是否有可能在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上下文。