【问题标题】:How to pipe command's output to program and keep its stdin open如何将命令的输出通过管道传输到程序并保持其标准输入打开
【发布时间】:2021-11-09 13:15:23
【问题描述】:

例如,我想将 `print(32) 发送到 python,它应该打印 32 并保持打开状态,直到我按 ctrl+d

我关注了

echo 'print(32)' | python

但它只打印 32 并关闭 python。

我让python的交互式shell保持打开状态,这样我就可以用我的键盘向它发送命令了。

编辑: 那只是一个例子。而不是 python,它可以是 noderubydocker exec -it 命令。

基本上我想像通过键盘输入一样输出管道

【问题讨论】:

  • 我认为这不是保持它打开,而是首先将标准输入连接到您的管道,当管道关闭时,将标准输入重新打开到您的 tty。

标签: bash shell stdin


【解决方案1】:

使用-i 标志在运行脚本后要求python 进行交互检查,结合bash 中的进程替换<(..) 构造。这将让 python 命令假定命令来自文件,即使它不是

python -i <(echo 'print(32)')
32
>>>

或将PYTHONINSPECT 变量设置为非空字符串以模拟-i 行为

PYTHONINSPECT=x python <(echo 'print(32)')

请注意,POSIX 模式不支持进程替换,但仅在 bash/zsh 或 ksh93 上。

【讨论】:

  • 很抱歉出现 XY 问题。我使用 python 作为我的问题的一个例子。请参阅编辑
  • 我不认为有一个适合所有的解决方案。每个工具可能都有自己的交互式会话处理实现
【解决方案2】:

如果您在 xwindow 中安装 xdotool,则可以使用以下命令模拟行为:

#!/bin/bash
        
feed_initial_input(){
    local initial_input="$1"; shift
    { sleep 0.3; xdotool type "$initial_input"$'\n'; } &
    "$@"
}

feed_initial_input "print(32)" python
feed_initial_input "console.log('Hello world!')" node

【讨论】:

    猜你喜欢
    • 2014-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-31
    • 1970-01-01
    • 2018-08-18
    • 2012-04-24
    • 2022-07-05
    相关资源
    最近更新 更多