是否可以在交互式bash shell 中输入输出一些文本的命令,以便它出现在下一个命令提示符下,就好像用户在该提示符下输入了该文本一样?
我希望能够创建source
一个脚本,该脚本将生成一个命令行并输出它,以便在脚本结束后提示返回时出现该脚本,以便用户可以在按下enter
执行它之前选择对其进行编辑。
这可以通过xdotool
但仅当终端在 X 窗口中并且安装时才有效。
[me@mybox] 100 $ xdotool type "ls -l"
[me@mybox] 101 $ ls -l <--- cursor appears here!
Run Code Online (Sandbox Code Playgroud)
这可以仅使用 bash 来完成吗?
我设法做到了
echo -n "命令" > /dev/tty1
字母出现,光标移动,但它们是“幽灵”——如果你点击Enter,没有任何反应(它们不在标准输入中)。
编辑:
在下面屏幕截图的中间,你明白为什么我看到了这个的使用。(带有红色标题的行,就在带有黄色标题的行的正下方。)就像现在一样,您并没有真正“编辑”注释文本;你只是被要求写一个新的文本,它将替换你正在(不是真的)编辑的笔记的文本。因此,我认为可以通过简单地将旧文本粘贴到 tty 中来补救:如果用户点击 Enter,则不会进行任何修改。(该程序在 Perl/MySQL 中,但我认为寻求通用解决方案比“我如何在 Perl 中执行此操作”更有趣。)
编辑2:
这是 Perl 代码,它使用下面的 C 代码(完全按预期工作),以及一个新的屏幕截图——希望这能澄清毫无疑问的事情:) 再次查看屏幕截图的中间,在那里进行了编辑到注释文本 - 这一次,旧文本在那里,例如,如果您只想修正错字,则不必重新键入整个注释文本。
my $edit_note_text = $edit_note_data[2];
print BOLD, RED, " new text: ", RESET;
system("writevt /dev/tty \"$edit_note_text\"");
my $new_text = <$in>;
$new_text = fix_input($new_text);
my $set_text = "UPDATE notes SET note = \"$new_text\" WHERE id = $edit_note_id";
$db->do($set_text);
Run Code Online (Sandbox Code Playgroud)
我经常使用子外壳运行命令,有时希望在运行某些东西之前扩展子外壳。这样我可以验证我在做什么,并可能编辑即将发生的事情。
例如,如何在运行之前扩展以下命令行,以便我可以编辑子shell的结果?
例如
$ find -name "test.txt"
/tmp/test.txt
$ mv $(!!) /tmp/new.txt
Run Code Online (Sandbox Code Playgroud)
我希望在运行命令之前看到扩展的子shell ,如下所示:
$ mv /tmp/test.txt /tmp/new.txt
Run Code Online (Sandbox Code Playgroud)
有没有办法做到这一点?