Jak*_*ake 32 linux bash file-io stdout pipe
我正在使用命令行实用程序,该实用程序需要传递文件名以将输出写入,例如
foo -o output.txt
Run Code Online (Sandbox Code Playgroud)
它写的唯一内容stdout是一条消息,表明它成功运行.我希望能够将写入的所有内容传递output.txt给另一个命令行实用程序.我的动机是output.txt的最终会被一个40 GB的文件,我不需要保留的,我宁愿管不是以逐步的方式对大量文件的工作流.
在这种情况下,有没有办法将实际输出(即output.txt)传递给另一个命令?我可以以某种方式神奇地传递stdout文件参数吗?
fra*_*nkc 48
命名管道工作正常,但是你可以通过bash进程替换获得更好,更直接的语法,它具有不使用必须在以后删除的永久命名管道的额外好处(进程替换在后台使用临时命名管道):
foo -o >(other command)
此外,如果要将输出通过管道输出到命令并将输出保存到文件,可以执行以下操作:
foo -o >(tee output.txt) | other command
aio*_*obe 40
最方便的方法是使用进程替换.在bash中,语法如下所示:
foo -o >(other_command)
Run Code Online (Sandbox Code Playgroud)
您可以如下显式/手动执行上述操作:
使用该mkfifo命令创建命名管道.
mkfifo my_buf
Run Code Online (Sandbox Code Playgroud)使用该文件作为输入启动另一个命令
other_command < my_buf
Run Code Online (Sandbox Code Playgroud)执行foo并让它将输出写入my_buf
foo -o my_buf
Run Code Online (Sandbox Code Playgroud)/dev/stdout您也可以/dev/stdout按如下方式使用设备文件
foo -o /dev/stdout | other_command
Run Code Online (Sandbox Code Playgroud)
Nes*_*iza 32
为了让stackoverflow高兴,让我写一个足够长的句子,因为我提出的解决方案只有18个字符而不是所需的30+
foo -o /dev/stdout
Run Code Online (Sandbox Code Playgroud)
你可以使用UNIX的魔力并创建一个命名管道:)
创建管道
$ mknod -p mypipe
Run Code Online (Sandbox Code Playgroud)启动从管道读取的进程
$ second-process < mypipe
Run Code Online (Sandbox Code Playgroud)启动进入管道的进程
$ foo -o mypipe
Run Code Online (Sandbox Code Playgroud)