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)
小智 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 手册页中的“历史扩展”部分有更多信息。
类似于 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)
实际上,您还可以从命令行剪切粘贴(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
在tcsh
or zsh
,Alt+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
。