bash 中是否可以重复尚未执行的字符串的一部分?

bash 中是否可以重复尚未执行的字符串的一部分?

我想知道是否可以在同一行(即链接)上重复部分命令(尚未执行)。

假设我想执行这个命令

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,则
  • !:0= ls,
  • !:1= -l,并且
  • !:2= 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”,那么这实际上是更多的打字。

相关内容