我想知道是否可以在Ubuntu终端中进行连锁操作:
action 1 on objectA . then action 2 on objectA
不必再重复objectA的名称。
例:
touch file.js && openEditor "$1"
或类似的东西。
&
将“触摸”命令发送到后台。如果您打算“打开编辑器,如果触摸成功”,那么你要&&
代替
我想知道是否可以在Ubuntu终端中进行连锁操作:
action 1 on objectA . then action 2 on objectA
不必再重复objectA的名称。
例:
touch file.js && openEditor "$1"
或类似的东西。
&
将“触摸”命令发送到后台。如果您打算“打开编辑器,如果触摸成功”,那么你要&&
代替
Answers:
使用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
GNU bash, version 4.3.48(1)-release
touch foo bar && ls -l !#:1-2
!
当您在交互式外壳中时,该字符会引入历史扩展表达式-用于在键入时进行即时命令行操作,并且在非交互式脚本中已禁用
arg1=file.js; touch "$arg1" && openEditor "$arg1"
常见用例有一个方便的快捷方式。在您的示例中,您正在执行:
$ 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处理命令行输入的程序。
echo 1 2 3 4
那么我要2
和3
下一个命令
Alt
并键入2.
,按空格键,按住Alt
并键入3.
–如果要范围,请使用历史记录扩展:!!:2-3
。
就默认的交互式外壳程序bash
和脚本外壳程序dash
而言,您可以使用$_
来调用last命令的last参数。
$ echo "Hello World"; echo same "$_"
Hello World
same Hello World
csh和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
$_
工作!#:n
方式与后者在将命令保存到历史记录之前的扩展方式略有不同。因此,返回历史记录仍会显示带有的命令,$_
而while !#:n
将被其实际值替换。两者都有其优点和缺点。
$_
应像往常一样将其引号,否则它将像其他所有内容一样被拆分和聚集。(我们只是在这里看不到它,因为echo
它的参数用单个空格连接。)但是,例如,touch "hello there"; ls -l $_
它将不起作用。
$_
是它的便携性。毕竟!#:n
是bash特定的。