我目前正在做:
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"