在Linux下使用bash脚本将C程序的输出重定向到另一个C程序

在Linux下使用bash脚本将C程序的输出重定向到另一个C程序,linux,bash,shell,scripting,Linux,Bash,Shell,Scripting,我已经编写了两个简单的C程序,program1打印出一个预定义的字符串,program2将一个字符串作为参数并将该字符串写入文件 我试图做的是获取program1的输出并将其传递给program2。我已经阅读了bash教程,我能找到的唯一解决方案是: program1 | program2 这应该是有效的,但我有一个分离故障。所以我试过这个,它很管用 program1 | program2 abc 正如您可以猜到的,这将导致一个包含字符串“abc”的输出文件。program1 | progr

我已经编写了两个简单的C程序,program1打印出一个预定义的字符串,program2将一个字符串作为参数并将该字符串写入文件

我试图做的是获取program1的输出并将其传递给program2。我已经阅读了bash教程,我能找到的唯一解决方案是:

program1 | program2
这应该是有效的,但我有一个分离故障。所以我试过这个,它很管用

program1 | program2 abc

正如您可以猜到的,这将导致一个包含字符串“abc”的输出文件。program1 | program2看起来很简单,但我想我在这里遗漏了什么?

使右侧的程序读取(作为STDIN)左侧程序的STDOUT

但是您的
程序2
根本不读取标准数据。它读取参数(不是STDIN)

你应该做:

program2 `program1`
Bash计算program1(当它看到反引号时),并将其作为arg传递给program2

在我的键盘上,回勾(`)位于“1”键的左侧,在我的左TAB键的上方

编辑: 如果
program1
的字符串输出包含空格,并且希望将整个字符串解释为一个参数,请使用“”或“”:


|
使右侧的程序读取(作为标准输入)左侧程序的标准输出

但是您的
程序2
根本不读取标准数据。它读取参数(不是STDIN)

你应该做:

program2 `program1`
Bash计算program1(当它看到反引号时),并将其作为arg传递给program2

在我的键盘上,回勾(`)位于“1”键的左侧,在我的左TAB键的上方

编辑: 如果
program1
的字符串输出包含空格,并且希望将整个字符串解释为一个参数,请使用“”或“”:


您说过,“program2将字符串作为参数。”

管道
|
系统重新定义程序的标准输入,而不是参数

要将program1的输出作为program2的参数,请使用:

  program2 $(program1)

$()
(也可以使用回勾`但有理由避免这样做)获取程序的输出并将其添加到当前行,然后重新计算它;因此,如果program1打印出“foo”,那么要运行的命令是
program2 foo

您说过,“program2将字符串作为参数。”

管道
|
系统重新定义程序的标准输入,而不是参数

要将program1的输出作为program2的参数,请使用:

  program2 $(program1)

$()
(也可以使用回勾`但有理由避免这样做)获取程序的输出并将其添加到当前行,然后重新计算它;因此,如果program1打印出“foo”,则要运行的命令是
Program2foo

,我认为这也应该起作用:

$ program1 | xargs program2

我认为这也应该起作用:

$ program1 | xargs program2


发布脚本后,您可能需要将输出存储到变量中,而不是直管中。这就是问题的原因。是的,我修改了第二个程序,所以它从stdin中获取字符串,我的原始脚本工作正常。谢谢所有的答案。发布脚本后,您可能需要将输出存储到变量而不是直管中。正如他所提到的,他的程序2将字符串作为参数,而不是STDIN。这就是问题的原因。是的,我修改了第二个程序,所以它从stdin中获取字符串,我的原始脚本工作正常。谢谢你的回答。注意,如果你的输出不止一个单词,你可能需要使用引号
program2“$(program1)”
或类似的内容。注意,如果您的输出将超过一个单词,您可能需要使用引号<代码>程序2“$(程序1)”或类似的东西。+1。是的,这也行。我更喜欢倒引号,因为它内置于bash中。xargs是一个单独的程序。+1。是的,这也行。我更喜欢倒引号,因为它内置于bash中。xargs是一个独立的程序。谢谢,这个似乎很有效。我修改了程序,因此有两个program1的输出,program2接受两个参数。它似乎也适用于多个参数。我认为最好用双撇号引用backticks,如下所示:
program2“`program1`
。否则,如果program1的输出包含空格,它将不会被视为一个参数,而是多个参数
echo`cat aFile`
就是一个很好的例子。另外,我要提到
program2“$(program1)”
是一个有效的选择。@lef2:你说得对。我将省略“$(program1)”,因为它出现在另一个投票结果较高的答案中。但我要提到的是“”。事实上,即使是“”也是有效的,并且比“”(虽然在这里它并不重要)更强大的转义。谢谢,这个似乎有效。我修改了程序,因此有两个program1的输出,program2接受两个参数。它似乎也适用于多个参数。我认为最好用双撇号引用backticks,如下所示:
program2“`program1`
。否则,如果program1的输出包含空格,它将不会被视为一个参数,而是多个参数
echo`cat aFile`
就是一个很好的例子。另外,我要提到
program2“$(program1)”
是一个有效的选择。@lef2:你说得对。我将省略“$(program1)”,因为它出现在另一个投票结果较高的答案中。但我要提到的是“”。事实上,即使是“”也是有效的,并且比“”的转义更强(尽管在这里它并不重要)。