我想知道是否可以在 Ubuntu 终端中进行如下连锁操作:
action 1 on objectA . then action 2 on objectA
而不必再重复 objectA 的名称。
例子:
touch file.js && openEditor "$1"
或类似的东西。
答案1
使用 bash历史扩展!#:n
,你可以使用例如引用当前命令行的第 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
答案2
对于常见用例,有一个方便的快捷方式。在您的示例中,您正在执行以下操作:
$ touch file.js
$ openEditor <alt>+<.>
在第二个命令中,诀窍是写入openEditor
(后面有一个空格)后跟Alt+ .。这将插入最后的论点最后的命令,即。(如果由于某种原因file.js
它不能使用,也应该可以工作。)AltEsc
由于“对象”通常确实是上一个命令的最后一个参数,因此可以经常使用它。它很容易记住,并且可以快速融入您直观使用的 shell 快捷方式中。
你可以用它做很多事情,这里有一篇关于这些可能性的深入文章:https://stackoverflow.com/questions/4009412/how-to-use-arguments-from-previous-command。
作为奖励,这不仅适用于 bash,还适用于所有使用 libreadline 处理命令行输入的程序。
答案3
就默认的交互式 shellbash
和脚本 shell而言dash
,您可以使用$_
它来调用最后一个命令的最后一个参数。
$ echo "Hello World"; echo same "$_"
Hello World
same Hello World
韓軟體并且 tcsh 有历史参考,特别是对于命令的最后一个词,你可以使用!$
, 以及对于单个参数 - !:<index>
:
~% echo foo bar
foo bar
~% echo !$
echo bar
bar
% echo bar baz
bar baz
% echo !:1
echo bar
bar
一般来说,最好将任何东西分配objectA
给变量,然后在多个命令、循环等中使用它。或者,也可以选择函数:
$ foo(){ echo "$@"; stat --print="%F\n" "$@";}
$ foo testdir
testdir
directory
答案4
在编写单行代码时,我有时会将重复的内容分配给我在命令中多次使用的 shell 变量。我可以调用并编辑它以使用不同的参数,使用向上箭头、control+a、control+向右箭头使光标靠近t=
。
t=testloop; asm-link -d "$t.asm" && perf stat -r2 ./"$t"
请注意,这使得添加扩展名或名称变体变得容易。
;
还要注意,在变量赋值之后我需要一个,因为var=value cmd
只是将其设置为该命令的环境变量,并且不会影响 shell 上下文。