我不知道如何表达,但我经常发现自己输入这样的命令:
cp /etc/prog/dir1/myconfig.yml /etc/prog/dir1/myconfig.yml.bak
我通常只需输入两次路径(使用制表符补全),或者使用光标复制并粘贴路径。有没有一些 bashfoo 可以让输入更容易?
答案1
有很多技巧(我认为可以找到重复的技巧),但为此我倾向于这样做
cp /etc/prog/dir1/myconfig.yml{,.bak}
它将扩展到您的命令。
这被称为大括号扩展。在此处使用的形式中,{}
表达式指定多个以逗号分隔的字符串。这些“扩展”整个/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
这些表达式可以嵌套:
echo a{b,c,d{e,f,g}}
产生
ab ac ade adf adg
有一种使用数字来生成序列的变体:
echo {1..10}
产生
1 2 3 4 5 6 7 8 9 10
您还可以指定步骤:
echo {0..10..5}
产生
0 5 10
答案2
历史扩展对于此类事情很有用(假设启用了 bash 历史记录)。
在你的例子中,你可以这样做:
cp /etc/prog/dir1/myconfig.yml !#:1.bak
这里,!#
指的是当前行,!#:1
指的是当前行上的参数1,
指!#:1.bak
的是当前行上的参数1,最后加上“.bak”。
当您输入历史说明符时,如果您想要仔细检查或修改文件名,可以使用Ctrl+ Alt+将其扩展为其实际值。E
bash 手册页中的“历史扩展”部分提供了更多信息。
答案3
与 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█
答案4
在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"'
必须像/Alt+Ctrl+_一样进行复制/snarf 和粘贴/复制。tcsh
zsh