我想做这样的事:
echo whoami | sh
该命令whoami
在 中运行sh
,但由于整个管道在子 shell 中运行,因此sh
解释器退出而不是给我 shell 提示符。如果不使用-c
参数,我如何向 发送一些输入sh
并让它继续运行?
我需要知道,因为sh
这只是一个例子;我有一个不同的程序,它有一个交互式解释器,但没有相当于-c
参数的东西。
我想做这样的事:
echo whoami | sh
该命令whoami
在 中运行sh
,但由于整个管道在子 shell 中运行,因此sh
解释器退出而不是给我 shell 提示符。如果不使用-c
参数,我如何向 发送一些输入sh
并让它继续运行?
我需要知道,因为sh
这只是一个例子;我有一个不同的程序,它有一个交互式解释器,但没有相当于-c
参数的东西。
这是您的
echo
问题,因为一旦生成字符串,它就会关闭管道whoami\n
。那么:
如果您的意思是 的
sh
输入应该首先是一个管道,然后切换为终端与终端交互的终端设备文件,那么您可以使用cat
Marcus 所展示的方式将来自该设备文件的内容转发到管道,而sh
的输入保留在管道中,或者在 的情况下sh
,您可以通过向它发送代码来告诉它在终端设备文件上重新打开其标准输入:请注意,由于
sh
它使用非 tty 设备作为 stdin 启动,因此它不会进入其交互模式操作(例如,它会输出提示符)。但您可以通过传递-i
选项来解决这个问题:根据
sh
实现情况,您可能会或可能不会看到该命令行的回显whoami; exec < /dev/tty
。以上内容是
dash
的实现。使用(bash)sh
的 GNU 实现:sh
请注意,
/dev/tty
上面是一个指向会话控制终端的快捷方式,比获取其实际路径更容易。或者,您可以通过将原始 stdin 复制到不同的 fd 来保存它,例如:
这样会更干净,因为即使在代码不是从终端运行而是从其他地方获取输入的环境中,它也能继续工作。