相关疑难解决方法(0)

如何从外部进程向现有进程的STDIN写入数据?

我正在寻找STDIN从外部进程向现有进程写入数据的方法,并发现了类似的问题 如何将数据从Python中的不同本地/远程进程流式传输到程序的STDIN中?在stackoverlow中.

在那个帖子中,@ Michael说我们可以在下面的路径中获取现有进程的文件描述符,并允许在Linux上将数据写入其中.

/proc/$PID/fd/
Run Code Online (Sandbox Code Playgroud)

所以,我创建了一个下面列出的简单脚本来测试从外部进程向脚本STDIN(和TTY)写入数据.

#!/usr/bin/env python

import os, sys

def get_ttyname():
    for f in sys.stdin, sys.stdout, sys.stderr:
        if f.isatty():
            return os.ttyname(f.fileno())
    return None

if __name__ == "__main__":
    print("Try commands below")

    print("$ echo 'foobar' > {0}".format(get_ttyname()))
    print("$ echo 'foobar' > /proc/{0}/fd/0".format(os.getpid()))

    print("read :: [" + sys.stdin.readline() + "]")
Run Code Online (Sandbox Code Playgroud)

这个测试脚本显示的路径STDINTTY,然后,等待一个写它STDIN.

我启动了这个脚本并在下面收到了消息.

Try commands below
$ echo 'foobar' > /dev/pts/6
$ echo 'foobar' > /proc/3308/fd/0
Run Code Online (Sandbox Code Playgroud)

所以,我执行的命令echo 'foobar' …

linux stdin process file-descriptor tty

24
推荐指数
2
解决办法
3万
查看次数

为什么 tmux 在粘贴多行命令时不插入换行符?

我在编写shell脚本(或其他相关语言)时经常使用REPL风格的编码方法,最近注意到以下问题。我运行 tmux,这样我就可以在 vim 的窗格中与终端提示符并排打开我的脚本。

多路复用器

如果我尝试在 Mac 上使用 CMD-v 一次粘贴多行命令,即

a=hello
b=World
echo $a $b
Run Code Online (Sandbox Code Playgroud)

tmux 无法正确处理换行符,而是给出以下输出:

[user@host: ~]$ a=hello
b='World'
echo $a $b
[user@host: ~]$ b='World'echo $a $b
Run Code Online (Sandbox Code Playgroud)

如果我清除提示并运行echo $a,我会hello在屏幕上回显,但echo $b会生成一个空行,并且显然该echo $a $b行不会运行。

我使用类似 REPL 得到相同的输出gnuplot,或者使用rlwrap.

替代 tmux 尝试

使用vim-slime或手动使用相关 vim-slime 系统调用时也会出现同样的问题:

[user@host: ~]$ tmux set-buffer 'a=hello
> b=World
> echo $a $b
> '
[user@host: ~]$ tmux paste-buffer -p
a=hello
b=World
echo $a $b
[user@host: …
Run Code Online (Sandbox Code Playgroud)

bash shell paste tmux

5
推荐指数
1
解决办法
3275
查看次数

标签 统计

bash ×1

file-descriptor ×1

linux ×1

paste ×1

process ×1

shell ×1

stdin ×1

tmux ×1

tty ×1