Bash命令在光标前复制并粘贴到后?

use*_*270 24 command-line bash clipboard line-editor

我不知道如何表达,但我经常发现自己输入这样的命令:

cp /etc/prog/dir1/myconfig.yml /etc/prog/dir1/myconfig.yml.bak
Run Code Online (Sandbox Code Playgroud)

我通常只输入两次路径(使用制表符完成),或者我将使用光标复制并粘贴路径。是否有一些 bashfoo 使输入更容易?

Ste*_*itt 43

有很多技巧(我认为有一个重复的),但为此我倾向于这样做

cp /etc/prog/dir1/myconfig.yml{,.bak}
Run Code Online (Sandbox Code Playgroud)

这将扩展到您的命令。

这称为大括号扩展。在此处使用的形式中,{}表达式指定了多个由逗号分隔的字符串。这些“扩展”整个/etc/prog/dir1/myconfig.yml{,.bak}表达式,{}依次用每个字符串替换部分:空字符串,给出/etc/prog/dir1/myconfig.yml,然后.bak,给出/etc/prog/dir1/myconfig.yml.bak。结果是

cp /etc/prog/dir1/myconfig.yml /etc/prog/dir1/myconfig.yml.bak
Run Code Online (Sandbox Code Playgroud)

这些表达式可以嵌套:

echo a{b,c,d{e,f,g}}
Run Code Online (Sandbox Code Playgroud)

产生

ab ac ade adf adg
Run Code Online (Sandbox Code Playgroud)

有一种使用数字来生成序列的变体:

echo {1..10}
Run Code Online (Sandbox Code Playgroud)

产生

1 2 3 4 5 6 7 8 9 10
Run Code Online (Sandbox Code Playgroud)

您还可以指定步骤:

echo {0..10..5}
Run Code Online (Sandbox Code Playgroud)

产生

0 5 10
Run Code Online (Sandbox Code Playgroud)

  • 参见手册中的[Brace Expansion](https://www.gnu.org/software/bash/manual/html_node/Brace-Expansion.html):它分隔了扩展中使用的值。这里的两个值是空字符串和`.bak`。 (5认同)

小智 12

历史扩展对这种事情很有用(假设启用了 bash 历史)。

在您的示例中,您可以执行以下操作:

cp /etc/prog/dir1/myconfig.yml !#:1.bak
Run Code Online (Sandbox Code Playgroud)

这里,the!#指的是当前行,!#:1指的是当前行上的参数 1,
以及!#:1.bak指的是当前行上的参数 1,并在末尾添加了 '.bak'。

当你有历史符打出来,你可以使用Ctrl+ Alt+ E,如果你想如双重检查或修改文件名扩大到其实际价值。

bash 手册页中的“历史扩展”部分有更多信息。


min*_*iot 8

类似于 progo 的答案,但稍微简单一些:C-w剪切(“杀死”)光标左侧的单词,C-y再次插入(“猛拉”)它。

$ cp /etc/dir1/myconfig.yml?                              (C-w)
$ cp ?                                                    (C-y)
$ cp /etc/dir1/myconfig.yml?                              (space, C-y)
$ cp /etc/dir1/myconfig.yml /etc/dir1/myconfig.yml?       (finish text)
$ cp /etc/dir1/myconfig.yml /etc/dir1/myconfig.yml.bak?
Run Code Online (Sandbox Code Playgroud)

  • 还值得注意的是,您可以连续使用多个单词(例如,如果您的文件名有空格),并且 Cy 将粘贴所有单词,只要您没有移动光标或在其间输入任何其他内容。任何混合的删除命令 _except_ 单字符删除(例如 backspace/del/ctrl-d)都适用于此。 (2认同)

mik*_*996 7

实际上,您还可以从命令行剪切粘贴(emacs/bash 术语中的 kill-yank)以复制部分以进行编辑。

M-d杀死向前直到单词边界,您可以多次杀死文本,并且它们都连接在一起成为一个“粘贴”以进行猛拉。方便的!

将这一切都拉回到光标处的命令行C-y。因此,如果您有这样的一行(块元素?表示光标位置):

$ cp avb.txt?                 (M-b M-b)
$ cp?avb.txt                  (M-d) kill the word 'avb'
$ cp ?.txt                    (C-y) yank it back
$ cp avb?.txt                 (C-e) to the end of line
$ cp avb.txt?                 (C-y) yank it again
$ cp avb.txt avb?             finish the line
$ cp avb.txt avb.foo?
Run Code Online (Sandbox Code Playgroud)

无论您喜欢哪种方式,熟悉 bash 在交互式关键部门提供的内容都是有益的。http://web.mit.edu/gnu/doc/html/features_7.html


Sté*_*las 6

tcshor zshAlt+Ctrl+_emacs模式(copy-prev-word小部件)插入最后一个单词,所以

cp 超长路径Alt+Ctrl+_.back

bash有一个copy-backward-word小部件(默认情况下不绑定到任何键),但它只将单词复制到环形缓冲区,您还需要按Ctrl-Y(在emacs模式下)来猛拉它。但你可以这样做:

bind '"\e[cpw~": copy-backward-word'
bind '"\e\C-_": "\e[cpw~\C-Y"'
Run Code Online (Sandbox Code Playgroud)

Alt+Ctrl+_做拷贝/ SNARF都粘贴/猛拉像tcsh/ zsh