![bash - 获取我正在通过历史编辑的当前命令的第一个参数,或类似的?](https://linux22.com/image/189963/bash%20-%20%E8%8E%B7%E5%8F%96%E6%88%91%E6%AD%A3%E5%9C%A8%E9%80%9A%E8%BF%87%E5%8E%86%E5%8F%B2%E7%BC%96%E8%BE%91%E7%9A%84%E5%BD%93%E5%89%8D%E5%91%BD%E4%BB%A4%E7%9A%84%E7%AC%AC%E4%B8%80%E4%B8%AA%E5%8F%82%E6%95%B0%EF%BC%8C%E6%88%96%E7%B1%BB%E4%BC%BC%E7%9A%84%EF%BC%9F%20.png)
我经常在 bash 提示符下编写命令,我想在当前行中获取先前的参数,然后将其放入命令中的其他位置。
一个简单的例子是,如果我想重命名一个文件。我会
- 键入
mv
命令 - 输入我要移动的文件名,
~/myTestFileWithLongFilename.txt
- 现在我只想更改我在第一个参数中提供的文件的扩展名,而无需再次输入。
我可以以某种方式使用历史记录或 bash 完成来自动完成第一个参数吗?
$ mv ~/myTestFileWithLongFilename.txt ~/myTestFileWithLongFilename.md
我当然知道我可以执行不完整的命令,将其放入历史记录中,然后用 引用它!$
,但是我的历史记录被无效命令污染了,我想知道是否有更好的方法
答案1
这是可能的,但有点麻烦。在 bash!#
中指的是已经输入的整行。您可以指定要在之后引用的给定单词:
,在本例中为!#:1
。您可以使用shell-expand-line
内置的 readline 键绑定 将其展开Control- Alt- e。
答案2
为了减少该命令所需的输入量mv
,可以使用大括号扩展:
mv ~/myTestFileWithLongFilename.{txt,md}
大括号扩展扩展为~/myTestFileWithLongFilename.txt
后跟~/myTestFileWithLongFilename.md
(正确的顺序很重要{txt,md}
)。
bash
无论您是在命令行还是在脚本中键入大括号扩展,它们都会起作用。
大括号扩展 ,prefix{word1,word2,word3}suffix
将为实际大括号中的每个重复重复prefix
和suffix
字符串wordN
,生成三个单独的单词prefixword1suffix
, prefixword2suffix
, 和prefixword3suffix
。您还可以在大括号扩展中使用范围,例如{1..4}
或。{p..u}
答案3
交互地,alt+1然后 alt+ .(句号)。
重复alt+.可进一步返回命令历史记录,从最近命令之前的命令中提取标记 #1。 (命令本身是标记 #0, alt+ 0)
如果没有 alt-<token-number>
修饰符,alt-.
将采用最后的上一个命令的 arg。例如mkdir foo
/ cd
alt+。返回创建一个目录并将 CD 放入其中。
通常,对于除最后一个标记(一次修改的击键)以外的任何内容,我只需向上箭头、control-w 或 alt+d,然后按 control-y 来删除该单词并将其拉回,以免弄乱我的历史记录,然后向下-箭头和 control-y 再次将其拉到我正在编辑的命令行中我想要的位置。顺便说一句,这是在 bash 中。
答案4
使用set -o vi
,按 escape byw$p
(您可能需要添加空格等,并且可能需要B
或W
)。然后你只需要修改一下即可。