Bash 将输出传递给其他命令时,使用cat是否会产生问题?

Bash 将输出传递给其他命令时,使用cat是否会产生问题?,bash,Bash,在bash中,有多种方法指导输入和输出。例如,这些命令执行相同的操作: sort <input_file >output_file cat input_file | sort >output_file 对输出文件进行排序 cat输入_文件|排序>输出_文件 通常我更喜欢第二种方式,因为我更喜欢命令从左到右读取 但问题的答案是: “排序”可以使用临时文件处理大于内存的输入文件 这让我想知道,在对一个大文件进行排序时,cat是否会使这个过程短路 在将输出传递给其他命令时,使用c

在bash中,有多种方法指导输入和输出。例如,这些命令执行相同的操作:

sort <input_file >output_file
cat input_file | sort >output_file
对输出文件进行排序
cat输入_文件|排序>输出_文件
通常我更喜欢第二种方式,因为我更喜欢命令从左到右读取

但问题的答案是:

“排序”可以使用临时文件处理大于内存的输入文件

这让我想知道,在对一个大文件进行排序时,
cat
是否会使这个过程短路


在将输出传递给其他命令时,使用
cat
会产生问题吗?

有一个术语我经常提到,第二个选项就是这个。当实用程序可以使用重定向在STDIN上获取输入(例如
sort
)时,不仅可以节省对外部进程(例如
cat
)的额外调用,还可以防止管道开销

除了额外的进程和管道之外,我看到的唯一其他“问题”是您将受到管道缓冲的影响

使现代化
显然,甚至有一个网站专门提供一个

我经常使用的一个术语叫做,第二个选项就是这个。当实用程序可以使用重定向在STDIN上获取输入(例如
sort
)时,不仅可以节省对外部进程(例如
cat
)的额外调用,还可以防止管道开销

除了额外的进程和管道之外,我看到的唯一其他“问题”是您将受到管道缓冲的影响

使现代化 显然,甚至有一个网站专门发布了一个“我更喜欢从左到右阅读我的命令”

output\u文件
(编写这篇文章的标准方法当然是对输入文件进行排序,对输出文件进行排序)

“我更喜欢从左到右读取命令”

output\u文件

(编写此命令的标准方法当然是
排序输入文件>输出文件

无论输入是通过标准输入和管道或I/O重定向到达,还是直接在命令行上命名,“sort”命令都会处理大文件

请注意,您可以(也可能应该)写:

即使输入和输出文件相同(或者如果您有多个输入文件,其中一个也是输出文件),也可以正常工作

我知道SiegeX已经因为虐待猫而责怪你了——猫虐待也是众所周知的。我会支持他的努力。有时可以使用
cat
。与人们通常认识到的情况相比,这是不合适的

适当使用的一个示例是使用
tr
命令和多个数据源:

cat "$@" | tr ...
这是必要的,因为
tr
只读取其标准输入,只写入其标准输出,这是“纯过滤器”程序的终极功能


Unix的作者还注意到,使用了通用的“cat输入|命令”结构,而不是更专门的输入重定向(引用缺失-无需手头上的书籍).

无论输入是通过标准输入和管道或I/O重定向到达,还是直接在命令行上命名,“sort”命令都会处理大文件

请注意,您可以(也可能应该)写:

即使输入和输出文件相同(或者如果您有多个输入文件,其中一个也是输出文件),也可以正常工作

我知道SiegeX已经因为虐待猫而责怪你了——猫虐待也是众所周知的。我会支持他的努力。有时可以使用
cat
。与人们通常认识到的情况相比,这是不合适的

适当使用的一个示例是使用
tr
命令和多个数据源:

cat "$@" | tr ...
这是必要的,因为
tr
只读取其标准输入,只写入其标准输出,这是“纯过滤器”程序的终极功能


Unix的作者们还注意到,使用了通用的“cat inputs | command”结构,而不是更专业的输入重定向(引用缺失-不需要手头上的书籍)。

+1:我想知道是否需要注意这一点。当然,对于单个输入文件来说,它是有效的。这很公平。尽管以箭头为例,我知道当我第一次看到这样的东西时(我对命令行是新手),我想知道为什么箭头没有指向东西的方向。如
输入文件>排序>输出文件
。但这只是学习约定的问题。是的,我想约定是命令输入文件
>
output+1:我想知道是否要注意这一点。当然,对于单个输入文件来说,它是有效的。这很公平。尽管以箭头为例,我知道当我第一次看到这样的东西时(我对命令行是新手),我想知道为什么箭头没有指向东西的方向。如
输入文件>排序>输出文件
。但那只是学习传统的问题是的,我想惯例是命令输入文件
outputI我喜欢他们建议
less
快速查看文件。我喜欢他们建议
less
快速查看文件。我想问题是:
cat
是否将文件内容流到
排序
,就像
sort
从磁盘读取它一样?还是说,
cat
在将文件提交给
sort
之前必须将整个文件加载到内存中?@Nathan:通常,
cat
在将文件块写入自己的标准输出之前,会将文件分块读取(可能相当大)。在将数据复制到输出之前,
cat
不太可能将整个文件读入内存;如果它映射了文件的内存,它可能会做类似的事情,但一般来说,它可能是可读的
cat "$@" | tr ...