HoC*_*Co_ 18 command-line bash
我想知道是否可以在 Ubuntu 终端中进行连锁操作,例如:
action 1 on objectA . then action 2 on objectA
Run Code Online (Sandbox Code Playgroud)
无需再重复 objectA 的名称。
例子:
touch file.js && openEditor "$1"
Run Code Online (Sandbox Code Playgroud)
或类似的东西。
ste*_*ver 31
使用 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
Run Code Online (Sandbox Code Playgroud)
Seb*_*ark 13
对于常见用例,有一个方便的快捷方式。在您的示例中,您正在执行以下操作:
$ touch file.js
$ openEditor <alt>+<.>
Run Code Online (Sandbox Code Playgroud)
在第二个命令中,诀窍是写openEditor
(后面有一个空格)后跟Alt+ .。这将插入最后一个命令的最后一个参数,即file.js
. (如果它Alt由于某种原因Esc不起作用,也应该起作用。)
由于通常“对象”确实是前一个命令的最后一个参数,因此可以经常使用。它很容易记住,并且可以快速集成到您直观使用的 shell 快捷方式中。
你可以用它做很多事情,这里有一篇关于可能性的深入文章:https : //stackoverflow.com/questions/4009412/how-to-use-arguments-from-previous-command。
作为奖励,这不仅适用于 bash,而且适用于所有使用 libreadline 处理命令行输入的程序。
就默认的交互式 shellbash
和脚本 shelldash
而言,您可以使用$_
来调用last command 的最后一个参数。
$ echo "Hello World"; echo same "$_"
Hello World
same Hello World
Run Code Online (Sandbox Code Playgroud)
csh和 tcsh 有历史参考,特别是对于命令的最后一个字,你可以使用!$
, 和个别参数 - !:<index>
:
~% echo foo bar
foo bar
~% echo !$
echo bar
bar
% echo bar baz
bar baz
% echo !:1
echo bar
bar
Run Code Online (Sandbox Code Playgroud)
通常,最好将任何内容分配给objectA
变量,并在多个命令、循环等中使用它。或者,可以选择一个函数:
$ foo(){ echo "$@"; stat --print="%F\n" "$@";}
$ foo testdir
testdir
directory
Run Code Online (Sandbox Code Playgroud)
我建议不要使用Steeldriver 的回答中给出的历史方法。这依赖于全局状态,而全局状态总是脆弱的。
更好的是使用适当的变量预先循环所有需要的命令:
$ for c in touch gedit; do $c foo.txt; done
Run Code Online (Sandbox Code Playgroud)
一般来说,有一点问题是,当发生故障时,Bash 不会中止,即这实际上的行为就像touch foo.txt; gedit foo.txt
而不是链接到&&
. 因此,为了安全起见,您可以添加break
:
$ for c in touch gedit; do $c foo.txt || break; done
Run Code Online (Sandbox Code Playgroud)