shell 有一个有用的功能,即按键盘向上箭头会将当前命令行的内容替换为上一个命令行的内容命令已输入。 (如果您再次执行此操作,则执行之前的命令,依此类推。)
我想要一个类似的功能,其中按下(其他一些按钮)会将当前命令行的内容替换为最后一行输出来自上一个命令(如果再次执行,则为上一行输出,依此类推。)
有没有任何 shell 提供这样的功能?
动机是您经常想要运行一个命令,然后运行另一个命令,并将前一个命令的部分输出作为输入。 (不,我不想做任何涉及将一个命令的输出通过管道传输到下一个命令的事情。我正在寻找一个交互的经验,您运行第一个命令的地方,看它的输出,然后将该输出的一行输入到下一个命令中,而无需使用鼠标进行笨拙的复制和粘贴。)
答案1
如果你在里面运行你的 shell screen
,你可以使用screen
的回滚模式来实现这一点。使用默认的键绑定:
- CtrlAEsc进入回滚模式;
- 移动键上下移动;
- Y将当前行复制到粘贴缓冲区并离开回滚模式;
- CtrlA]粘贴缓冲区。
文档(运行man screen
)提供了更多详细信息,并描述了回滚模式的其他功能(包括搜索、部分复制等)。
tmux
毫无疑问具有相似的特征。
答案2
如果我没看错的话,您想从一个命令的输出中取出最后一行,并将其作为新命令执行。因此:
$ $( /path/to/command_generator | tail -n1 )
或者,如果它是磁盘上文件的内容:
$ $( tail -n1 /path/to/RUNME.txt )
如果您想在执行之前对其进行编辑,可以使用vipe
,这是一个用于编辑运行中管道内容的工具:
$ $( /path/to/command_generator | vipe )
答案3
也许您想`!!`
重新执行前面的命令并内联使用它的输出,例如查找文件:
$ find . -name "myfile.txt"
./dir/files/myfile.txt
$ emacs `!!` &
emacs `find . -name "myfile.txt"` &
这相当于:
$ emacs ./dir/files/myfile.txt &
答案4
Bash 可以保存非交互式命令的输出,然后您可以使用 Ctrl-G 在编辑器中打开该输出,并将所需的字段拉入当前命令行:https://asciinema.org/a/395092