如何在不读取/写入中间文件的情况下在 shell 之间传递数据

Ron*_*erk 4 shell

假设我有一个在 shell 中运行的回显用户输入的进程。那么如何从另一个终端向/从该外壳传递数据?是否可以不使用中间文件?

例如,如果我有代码

fgets(string, LEN, stdin);
printf("%s", string);
Run Code Online (Sandbox Code Playgroud)

那么,是否可以将数据传递给stdin,并stdout通过不同的外壳从中获取数据?

ilk*_*chu 9

我不确定我是否明白你的意思,但是。

在单个 shell 会话(终端)中,您将使用管道将数据从一个命令传递到另一个命令,如下所示:

$ ls -l | grep something
Run Code Online (Sandbox Code Playgroud)

如果需要在两个不同的 shell 之间执行此操作,可以使用命名管道:

tty1$ mkfifo /tmp/mypipe
tty1$ ls -l > /tmp/mypipe
tty2$ grep something < /tmp/mypipe
Run Code Online (Sandbox Code Playgroud)

使用mktemp创建一个目录来放置命名管道会更安全:

tty1$ dir=$(mktemp -d)
tty1$ mkfifo "$dir/mypipe"
tty1$ ls -l > "$dir/mypipe"
tty1$ rm -r "$dir"
Run Code Online (Sandbox Code Playgroud)

虽然这需要将路径复制到另一个窗口,可能需要手动。

当然,命名管道有点像中间文件,因为它需要一个路径名。但它的作用更像是一个管道,因为数据不会被写入永久存储,如果写入器很慢,读取器会等待写入器,而不是可能遇到过早的文件结束。

(您通常会使用ls -l *something*代替ls | grep,但它可以用作示例。)

  • @RonnyLandsverk,不,写入`/proc/$pid/fd/0` 会写入该进程的 fd 0 连接的位置。它_不_写入_到_进程,而是写入到与写入 fd 0 _from_ 进程相同的位置。(除了打开 `/proc/$pid/fd/0` 会创建一个新的文件描述,具有单独的查找位置等) (2认同)