考虑以下命令:
$ awk 'BEGIN { system("ed") }'
q
$ echo hello | awk 'BEGIN { system("ed") }'
?
$
在第一种情况下,我可以运行 ed,然后留在编辑器中,并使用 q 命令手动退出;但在第二种情况下,ed 自动退出。为什么 ed 交互式会话在第二个命令中不起作用?有没有办法在管道中运行 AWK 系统函数来调用交互式命令?
考虑以下命令:
$ awk 'BEGIN { system("ed") }'
q
$ echo hello | awk 'BEGIN { system("ed") }'
?
$
在第一种情况下,我可以运行 ed,然后留在编辑器中,并使用 q 命令手动退出;但在第二种情况下,ed 自动退出。为什么 ed 交互式会话在第二个命令中不起作用?有没有办法在管道中运行 AWK 系统函数来调用交互式命令?
在第一种情况下,您没有使用 stdin(和 stdout),因此
ed
从终端读取并获取您在终端上键入的输入。在第二种情况下,您已将 stdin 重定向awk
,因此也将命令/进程ed
的 stdout 重定向,因此将获取行“hello”作为输入,这不是一个有效命令,后跟 EOF,缓冲区为空时会导致它退出(像命令一样),就像您给出交互式 shell 命令然后立即输入 control-D 或等效命令一样。echo
ed
ed
q
ed
您可以
ed
通过重定向回终端来交互运行:system("ed </dev/tty")
。但这不会实现任何功能,因为您无法ed
直接从 shell 运行,所以何必呢?