“wc”命令的行为是什么?

4

例如:

myCleanVar=$( wc -l < myFile )
myDirtVar=$( wc -l myFile )

echo $myCleanVar
9

echo $myDirtVar
9 myFile

为什么在“myCleanVar”中,我从“wc”命令中得到了一个“整数”值,而在“myDirtVar”中,我得到了类似于“9 file.txt”的东西?我用引号引起来是因为我知道在Bash shell中,默认情况下所有内容都被视为字符串,但是我不明白第一和第二个表达式的行为差异。在这种情况下,“<”重定向有什么特殊效果?


1
为什么不直接在shell中尝试它们,以直接观察其行为呢? - Oliver Charlesworth
2个回答

5
< p > < code > wc 的< code > man 页面上写着:

NAME

   wc - print newline, word, and byte counts for each file

SYNOPSIS

   wc [OPTION]... [FILE]...
   wc [OPTION]... --files0-from=F

DESCRIPTION

Print newline, word, and byte counts for each FILE, and a total line if more than one FILE is specified.

当你将文件作为参数传递时,它也会打印文件名,因为你可以向wc传递多个文件以计算行数,这样你就知道哪个文件具有该行数。当然,当你使用stdin时,它不知道文件的名称,因此不会打印文件名。

示例

$ wc -l FILE1 FILE2
  2 FILE1
  4 FILE2
  6 total

5
wc默认会列出文件名,这样您就可以在多个文件上使用它(并获取所有文件的结果)。如果未指定文件名,则使用“标准输入”,通常是控制台输入,并且不打印文件名。需要使用<来指定“输入重定向”,即从给定文件中读取输入,而不是使用用户输入。
将所有这些信息放在一起,您就可以理解wc在您的示例中的行为原因。
问题时间:命令cat file | wc -l的输出是什么?

谢谢!你说得对,重定向<“欺骗”了wc,让它认为文件的内容是通过键盘输入的。简单来说:输入重定向“删除”了fileName,因此wc没有任何fileName可打印。使用<,wc就会出问题。好吧,我在Spreadshirt上考虑做一件印有“With < the wc sucks.”的T恤!:P - shogitai

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接