我想知道是否可以在同一行(即链接)上重复部分命令(尚未执行)。
假设我想执行这个命令
mkdir -p /some/long/dest/path && rsync -azP /some/long/src/path /some/long/dest/path
是否可以只输入类似于
mkdir -p /some/long/dest/path && rsync -azP /some/long/src/path /path/at/x:2
显然,x:2
是最后执行的命令数组中的索引,所以我想知道是否有可能将字符串链接在一起并x
在当前字符串的位置重新使用命令。
您可以使用行编辑功能来获取
mkdir
参数并将其粘贴到行尾。(我使用vi
- 样式的行编辑,因此非常简单: ESC 进入编辑模式,0WW
跳转到mkdir
路径,yW
拉出路径,然后p
粘贴它。我假设默认emacs
- 样式的行编辑中有一个等价物。 )或者,
或者,由于这是一个交互式会话,请通过检查
mkdir
查看结果:如果您以前没有遇到过,它是最后一个命令的
!$
最后一个参数 ( ) 的替换。$
它在man bash
(除其他外)。试试这个,看看它是如何进行的:项目从零开始引用,依此
echo !!:0
类推。我知道无法使用此类-style 运算符在当前命令行中引用参数。
history
我已经足够大,可以记住硬拷贝终端 (对你们孩子来说,想象一台带键盘的打印机),我相信这种编辑器风格的命令行编辑是一种不会持续太久的时尚。 :-)
但是,说真的,我发现我不是唯一一个听说过
!
-style 命令历史的人。它在bash(1)中有一些详细的讨论 ;见 历史部分。这是一个简短的摘要(即,一个示例列表,其中包含一些关于通用形式的提示):示例
!number
;!42
history
列表中的第 42 条命令;如果有删除或截断,这会变得复杂。!-number
;!-1
,!-2
,!-42
!-1
是最近的命令;!-2
是之前的命令,等等-1
是默认的,!-1
可以缩写!!
并且 (见下文)可以缩写。!-1:something
!:something
thing1:thing2
thing1
由 修改。一个事物可以有多个修饰符。请参阅下面的示例。thing2
:number
ls -l foo
,那么!:0
=ls
,!:1
=-l
, 和!:2
=foo
。:$
:$
可以缩写$
。:h
dirname
。:t
basename
。一个似乎不太为人所知的结构是
!#
引用当前 命令。 所以,你的命令可以输入为
where让你从这个命令中
!#:2
得到第二个单词 (/some/long/dest/path
) 。而且,如果
rsync
论点真的几乎是相邻的,正如你的例子所暗示的,你可以走得更远,说where
!#:2:h:h
是具有多个修饰符的事物的示例 -dirname(dirname(!#:2))
=/some/long
。我们甚至可以更进一步:但是,如果
basename(!:2)
是真的,字面意思是“path
”,那么这实际上是更多的打字。