我想知道是否可以在同一行(即链接)上重复部分命令(尚未执行)。
假设我想执行这个命令
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
当前字符串的位置。
答案1
您可以使用行编辑功能来获取mkdir
参数并将其粘贴到行尾。 (我使用vi
-style 行编辑,所以这将非常简单:ESC 进入编辑模式,0WW
跳转到mkdir
路径,yW
拉出路径,然后p
粘贴它。我假设默认 -style 行编辑中有一个等效的东西emacs
。 )
或者,
p=/some/long/dest/path; mkdir -p "$p" && rsync -azP /some/long/src/path/ "$p"
或者可能,因为这是一个交互式会话,所以查看mkdir
结果通过检查:
mkdir -p /some/long/dest/path
rsync -azP /some/long/src/path/ !$
如果您以前没有遇到过它,!$
则可以替换$
最后一个命令的最后一个参数 ( )。它在man bash
(以及其他)中。尝试一下,看看它是如何进行的:
date --date tomorrow
echo !$
date --date !$
项目从零开始引用,等等echo !!:0
。
我不知道如何引用其中的论点当前的使用此类 - 样式运算符的命令行history
。
答案2
我已经足够大了,可以记住硬拷贝终端 (对于你们这些孩子来说,想象一下带有键盘的打印机)并且我相信这种编辑器式的命令行编辑是一种时尚,不会持续太久。 :-)
不过实话说,我懂了我不是唯一听说过的人!
-style 命令历史的人。它在一些细节中进行了讨论 重击(1);看到 历史部分。以下是一个简短的摘要(即,带有一些关于通用形式的提示的示例列表):
语法/ 示例 |
解释/评论 |
---|---|
!number ;!42 |
自您登录以来的第 42 个命令。或者更确切地说, history 列表中的第 42 个命令;如果存在删除或截断,事情就会变得复杂。 |
!-number ; !-1 , !-2 ,!-42 |
相对寻址。 !-1 是最近的命令;!-2 是之前的命令,等等 -1 是默认的,!-1 可以缩写!! 并且 (见下文)可以缩写。!-1:something !:something |
thing1:thing2 |
thing1 修改为.一个事物可以有多个修饰符。请参阅下面的示例。thing2 |
:number |
这n第一个词。作为 罗艾玛 说,字编号从 0 开始,因此,如果前一个命令是ls -l foo ,则
|
:$ |
最后一个字。作为 罗艾玛显示不用解释,:$ 可以缩写$ 。 |
:h |
头;与...一样dirname 。 |
:t |
尾巴;与...一样basename 。 |
一个似乎不太为人所知的结构是 !#
,参考这 当前命令。 所以,你的
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 !#:2
从哪里!#:2
可以得到第二个单词 ( /some/long/dest/path
)这命令。
而且,如果rsync
参数确实几乎相邻,正如您的示例所示,您可以更进一步说
mkdir -p /some/long/dest/path && rsync -azP !#:2:h:h/src/path !#:2
其中!#:2:h:h
是具有多个修饰符的事物的示例 — dirname(dirname(!#:2))
= /some/long
。我们甚至可以更进一步:
mkdir -p /some/long/dest/path && rsync -azP !#:2:h:h/src/!#:2:t !#:2
但是,如果basename(!:2)
真的是字面上的“ path
”,那么这实际上是更多的打字。