正确的管道使用

正确的管道使用

我目前正在做:

cat file1 file2 | sort -k1,1 > temp_file
command [options] -i temp_file > result_file

-i 指定命令输入,在本例中为文件;我想要一种无需显式指定 temp_file 即可执行此操作的方法。

cat file1 file2 | sort -k1,1 | command [options] -i > result_file失败,抱怨 -i 之后没有文件。

我也尝试过参数但这导致在每一行内容上执行而不是在文件上执行。

答案1

有些应用程序理解-stdin 的意思(查看它的手册页),所以

sort... | cmd -i - > result.txt

大多数系统都有一个/dev/stdin特殊文件(与 相同/dev/fd/0),打开该文件时的行为类似于复制 stdin,因此:

sort... | cmd -i /dev/stdin > result.txt

使用一些 shell(ksh、zsh、bash),你也可以这样写:

cmd -i <(sort...) > result.txt

虽然这可行,但该文件是一个管道,所以不是可寻找的。有些cmd可能需要可查找文件或常规文件,如果文件是管道,则会失败。那么,除了使用临时文件之外,您别无选择。

有了zsh,您可以使用=(...)以下形式流程替代:

cmd -i =(sort ...) > result.txt

用于zsh自动创建、填充和清理临时文件。

与 相同fish,使用psub:

cmd -i (sort... | psub -f) > result.txt

对于bash,仍然使用/dev/fd/x文件,但这次是在常规临时文件上,在打开后立即删除以进行更可靠的清理:

tmp=$(mktemp) && {
  rm -f -- "$file" &&
    sort... >&3 3>&- 4<&- &&
    cmd -i /dev/fd/4 3>&-
} 3> "$tmp" 4< "$tmp"

相关内容