bash(或者任何 shell)是否有“覆盖”模式?

bash(或者任何 shell)是否有“覆盖”模式?

我正在对一组文件运行类似的命令。例如,假设我正在做这样的事情(这不是我正在做的事情,只是一个例子):

> cat path/to/dir/file01.txt
  [file contents]
> another-command path/to/dir/file01.txt
  [more output]
> cat path2/to/dir/file02.txt
  [file contents, from which I can tell I should do something different]
> different-command path2/to/dir/file02.txt
  [yet more output]
> cat path3/to/dir/file03.txt
  [file contents]
> another-command path3/to/dir/file03.txt
  [output]

ETC。

如果使用该键返回到上一个命令后,我可以覆盖非重复的文本(例如文件名或路径的通用部分),而不必删除它并重新输入,那将会很方便。

有没有办法做到这一点?

答案1

不是你直接要求的,但你可以使用各种形式的历史互动简化你的任务:

$ cat path/to/dir/file01.txt
cat: path/to/dir/file01.txt: No such file or directory
$ different-command !$
different-command path/to/dir/file01.txt
bash: different-command: command not found
$ cat !$:s/1/2/
cat path/to/dir/file02.txt
cat: path/to/dir/file02.txt: No such file or directory
$ ^2^3
cat path/to/dir/file03.txt
cat: path/to/dir/file03.txt: No such file or directory
$ !-3:s/1/3/
different-command path/to/dir/file03.txt
bash: different-command: command not found
$ !diff:s/3/4/
different-command path/to/dir/file04.txt
bash: different-command: command not found

忽略错误,每次我使用历史交互(,,!$)时,您都可以看到它是如何扩展的。!$:s/1/2^2^3bash

  • !$- 前一个命令的最后一个字
  • :s/1/2- 用 替换所选单词中第一次出现的1(在本例中,又是)。2!$
  • ^2^3-在整个前一个命令中用替换第一次出现的23
  • !-3- 运行倒数第三个命令。
  • !diff- 运行以 开头的最后一个命令diff

答案2

您可以将一个键绑定到中的 readline 指令$HOME/.inputrc

"code": overwrite-mode

要发现特定键生成的代码,请同时按下Ctrl和,V然后按下该键。例如,当您按下Ins(插入)键时,您会看到^[[2~。请注意,这^[只是 ESC 的屏幕表示,它用\ereadline 表示。因此,您应该将以下行添加到$HOME/.inputrc

"\e[2~": overwrite-mode

并重新启动 bash。

答案3

Bash 有这个功能,但是默认情况下它没有绑定到任何键。

添加行

Control-o: overwrite-mode

$HOME/.inputrc或者使用+在插入模式和覆盖模式之间切换/etc/inputrcCtrlo

READLINE请参阅Bash 手册页了解更多信息。

相关内容