Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 有没有办法在unix中向程序提供stdin/out而不是文件?_Bash_Unix - Fatal编程技术网

Bash 有没有办法在unix中向程序提供stdin/out而不是文件?

Bash 有没有办法在unix中向程序提供stdin/out而不是文件?,bash,unix,Bash,Unix,我有一个来自第三方的命令行实用程序(它很大,是用Java编写的),我一直在使用它来帮助我处理一些数据。此实用程序需要一个以行分隔的文件中的信息,然后将处理后的数据输出到标准输出 在我的测试阶段,我可以编写一些Perl来创建一个包含要处理的信息的文件,然后将该文件发送给这个第三方实用程序,但随着我即将将此代码投入生产,我真的更喜欢直接将数据管道传输到这个实用程序,而不是先将数据写入文件,因为这样可以节省将不需要的信息写入磁盘的开销。在unix中有什么方法可以做到这一点吗 目前,我按如下方式调用该实

我有一个来自第三方的命令行实用程序(它很大,是用Java编写的),我一直在使用它来帮助我处理一些数据。此实用程序需要一个以行分隔的文件中的信息,然后将处理后的数据输出到标准输出

在我的测试阶段,我可以编写一些Perl来创建一个包含要处理的信息的文件,然后将该文件发送给这个第三方实用程序,但随着我即将将此代码投入生产,我真的更喜欢直接将数据管道传输到这个实用程序,而不是先将数据写入文件,因为这样可以节省将不需要的信息写入磁盘的开销。在unix中有什么方法可以做到这一点吗

目前,我按如下方式调用该实用程序:

bin/someapp执行操作——选项1一些值——输入一些文件

我想做一些类似的事情:

bin/someapp执行操作——选项1某些值——在数据中输入$piped\u

在不修改第三方应用程序的情况下,这样做是否可行?

您可以在bash中使用“进程替换”来实现您想要的东西

bin/someapp do-action --option1 some_value --input <(generate_input.sh)

bin/someapp do action--option1 some_value--input您应该能够使用/dev/stdin:

bin/someapp do-action --option1 some_value --input /dev/stdin

(请注意,在某些系统上,/dev/stdin是一个符号链接;如果您的Java程序不能处理这个问题,您可能不得不使用/dev/fd/0或类似的东西。)

另一种方法是,如果
/dev/stdin
技术由于某种原因不适用,则使用“命名管道”

如果你这样做

% mkfifo /path/to/file
然后,这将创建一个具有该名称的文件系统对象,它可以充当两个进程之间的管道。这与普通管道的情况相同,只是进程可以像引用普通文件一样引用管道。例如:

% mkfifo /tmp/my-fifo
% grep alias ~/.bashrc >/tmp/my-fifo &
[1] 70134
% sed 's/alias/wibble/' /tmp/my-fifo
wibble ls='ls -F'
....
[1]  + done       grep alias ~/.bashrc > /tmp/my-fifo
% 

在这里,
grep
命令将写入FIFO,就像它是一个普通文件一样,当指定管道的缓冲区填满时,它将阻塞。sed
sed
进程从管道中读取数据(就像它是一个普通文件一样),并在读取过程中清空缓冲区。

这并不容易/dev/stdin,命名管道,那么我应该在什么时候将数据发送到stdin?它会等我打电话给它吗?或者我会马上做吗?这到底是如何工作的?在普通管道中使用它:
generate_data.pl | bin/someapp do action--option1 some_value--input/dev/stdin
Awesome。这正是我想要的。结果证明这实际上不起作用。运行它时,我在线程“main”java.io.FileNotFoundException:/dev/stdin中得到:Exception(没有这样的设备或地址)。该死有什么想法吗?看看你系统上的/dev/stdin(即
ls-l/dev/stdin
)。它真的存在吗?它是设备文件还是符号链接还是什么?如果它是一个符号链接,请尝试使用它指向的实际设备文件。太棒了!有没有办法在那里使用perl脚本?为了测试,我尝试了:echo try改为:cat-<或just
cat关于StackExchange有一个更全面的答案,请参阅。