相关疑难解决方法(0)

bash 可以写入自己的输入流吗?

是否可以在交互式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 来完成吗?

bash

48
推荐指数
4
解决办法
9833
查看次数

通过将字符串放入 tty 来构造命令

我设法做到了

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)

Better_example

io tty stdin

17
推荐指数
4
解决办法
7963
查看次数

在执行之前展开子shell?

我经常使用子外壳运行命令,有时希望在运行某些东西之前扩展子外壳。这样我可以验证我在做什么,并可能编辑即将发生的事情。

例如,如何在运行之前扩展以下命令行,以便我可以编辑子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)

有没有办法做到这一点?

shell bash command-history subshell

12
推荐指数
1
解决办法
1767
查看次数

标签 统计

bash ×2

command-history ×1

io ×1

shell ×1

stdin ×1

subshell ×1

tty ×1