Bash Shell编程,管道输出fil

Bash Shell编程,管道输出fil,bash,shell,pipe,Bash,Shell,Pipe,这里是一个shell编程新手 到目前为止,我有以下代码: prog inputfile outputfile1 sort -rn outputfile1 | cut -f1-2 > outputfile2 我的问题是,有没有一种方法可以将outputfile直接从第一个命令传递到第二个命令以获取outputfile2,即跳过创建outputfile1的需要?prog是一个自定义程序,以inputfile和outpufile名称作为参数 我发现的最接近的东西是贝壳中的替代物 sort &

这里是一个shell编程新手

到目前为止,我有以下代码:

prog inputfile outputfile1

sort -rn outputfile1 | cut -f1-2 > outputfile2
我的问题是,有没有一种方法可以将outputfile直接从第一个命令传递到第二个命令以获取outputfile2,即跳过创建outputfile1的需要?prog是一个自定义程序,以inputfile和outpufile名称作为参数

我发现的最接近的东西是贝壳中的替代物

sort <(ls dir)

排序如果我答对了-相反:

prog inputfile >(sort -rn | cut -f1-2 >outputfile)
取决于您可能使用的程序

prog inputfile /dev/stdout | sort -rn | cut -f1-2 >outputfile
甚至

prog inputfile - | sort -rn | cut -f1-2 >outputfile

哇,谢谢!前两种方法对我有效,但第三种方法不行。顺便问一下,什么是方法/变通方法?我想读更多关于它的资料。:)请
prog
的作者修复它。我不知道它是否有名字。在第一种情况下,您将子shell的输入作为文件名传递,在第二种情况下,您将传递stdout(如果您的程序在其stdout中输出您并不真正需要的内容,则可能会出现问题)。第三种方法是为输出文件指定stdout的常用方法,但它要求程序识别此符号。它称为进程替换,不要与使用$()或反勾号的命令替换混淆。它使用命名管道,如果您的shell不支持此功能(如ksh88),这是一种替代机制。是的,第一种。第二个(指/dev/stdout或/dev/fd/1)是否有名称?它甚至需要一个吗?:)这就是为什么
prog
s不应要求其输入和输出文件作为文件名提供的原因。大多数Unix实用程序写入标准输出,除非您使用一个选项(通常是
-o
)明确指定输出文件名,否则它们从标准输入读取,除非给出参数文件名,并且它们支持
-
作为参数来表示标准输入或输出。nah、@reinierpost、,这就是为什么bash提供了处理它的机制:)您不能期望所有的程序以任何方式一致地运行;-)@reinierpost嗯,要求作者修复它比我自己找到解决方法要复杂一些。但是谢谢你的评论,我以后写自己的程序时会记住这一点。:)嗯,
/dev/stdin
/dev/stdout
不是由bash提供的,而是由POSIX(-like)环境提供的。我想是吧;这些天来,在大多数运行Unix shell的机器上都会出现这种情况—我主要使用Linux和Cygwin,它们都有。
/dev/fd/*
只是Linux,加上一些可以模拟Linux procfs的操作系统(fbsd、openbsd,可能还有其他)。此外,Bash在内部为一些构造(重定向和
[[
命令)处理它们,这些构造可以在任何操作系统上使用。其他一些GNU程序,如
sed
在某些条件下,对于名为
/dev/std{in,out,err}
的文件也有特殊的例外。