我正在使用一个命令行实用程序,它需要传递要写入输出的文件名,例如
foo -o output.txt
它写入
stdout
的唯一内容是一条指示其运行成功的消息。我希望能够将写入 output.txt
的所有内容通过管道传输到另一个命令行实用程序。我的动机是,output.txt 最终将成为一个我不需要保留的 40 GB 文件,我宁愿通过管道传输流,也不愿逐步处理大量文件。
在这种情况下有什么方法可以将实际输出(即
output.txt
)传输到另一个命令吗?我可以以某种方式神奇地传递 stdout
作为文件参数吗?
最方便的方法是使用进程替换。在 bash 中,语法如下所示:
foo -o >(other_command)
(请注意,这是一种 bashism。其他 shell 也有类似的解决方案,但底线是它不可移植。)
mkfifo
命令创建命名管道。
mkfifo my_buf
other_command < my_buf
foo
并让它将输出写入
my_buf
foo -o my_buf
/dev/stdout
/dev/stdout
如下
foo -o /dev/stdout | other_command
foo -o >(other command)
foo -o >(tee output.txt) | other command
foo -o /dev/stdout
$ mknod -p mypipe
$ second-process < mypipe
$ foo -o mypipe
foo -o <(cat)
/dev/stdout
实际例子, 我有一个加密的 ssh 密钥。
mkfifo key && sops --decrypt [email protected] > key &
ssh-keygen -y -f key
结果:
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: UNPROTECTED PRIVATE KEY FILE! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0644 for 'key' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
Load key "key": bad permissions
我想通过管道传输数据而不散布文件。并且 ssh-keygen 没有从 stdin 读取好吧,
ssh-keygen -y -f /dev/stdout
的工作方式也不同,但它可能偏离主题。例如,获得完整的图片