Bash - cat 命令和错误

Bash - cat command and errors

我正在尝试 bash shell 重定向。我有一个目录,其中只有一个文件 - a.txt

more a.txt
HELLO

如果我输入 cat < a.txt b.txt ,我得到

cat: b.txt: No such file or directory

如果我输入

cat  < a.txt   b.txt a.txt

我明白了

cat: b.txt: No such file or directory
HELLO

为什么我在尝试 cat < a.txt b.txt 时没有看到 HELLO?我尝试了不同的组合 - 多次输入 a.txt before/after b.txt 并看到了一种模式,但无法弄清楚原因。

cat  <   a.txt a.txt b.txt  
HELLO
cat: b.txt: No such file or directory

我假设您没有正确使用 cat。 Cat 需要一个或多个文件作为参数而不是数据流。

使用 cat 显示文件:

cat a.txt

将其重定向到文件 b.txt

cat a.txt > b.txt

你的最后一个问题,带有模式。

您将 3 个参数传递给 cat。

Arg1: (< a.txt) 参数 2:(a.txt) 参数 3:(b.txt)

参数 1 毫无意义,参数 2 是有效文件,参数 3 是错误文件。

< inputfile 是重定向。 < 将文件 inputfile 重定向到命令的标准输入 标准输入 <inputfile 不会作为参数传递给命令。位置无关紧要,这些行完全 相同:

< inputfile command arg1 arg2
command < inputfile arg1 arg2
command arg1 < inputfile arg2
command arg1 arg2 < inputfile

Why am I not seeing HELLO when I try cat < a.txt b.txt?

来自man cat

 With no FILE, or when FILE is -, read standard input.

因为给定参数,cat 没有从标准输入中读取 - 标准输入被忽略。相反,它从给定的 FILEs 中读取参数。所以标准输入上的 a.txt 被忽略了。

你可以这样做:

< a.txt cat - b.txt
# or
cat - < a.txt b.txt
# or
cat - b.txt < a.txt
# or really just
cat a.txt b.txt

重定向意味着将文件的内容发送到命令的 STDIN。

cat 的行为是在 STDOUT 的参数中读取文件内容。但如果没有参数,则从 STDIN 读取内容。

看到我写argument(s)吗?因为参数个数可以是0个、1个或多个。

简单的伪代码是这样的:

if number of arguments = 0
  print STDIN to STDOUT
else
  for each file in arguments
    print file content to STDOUT

示例 1:

cat a.txt

输出:

HELLO

示例 2:

cat(然后输入)

您将能够在终端中输入,当您单击回车时,输入的行将发送到 cat 的 STDIN。然后 cat 将打印您刚刚输入的行。

回答

所以当你键入:

cat < a.txt b.txt

在内部,它是这样工作的:

  • STDIN 填充了 a.txt HELLO text
  • 的内容
  • $1(第一个参数)是 b.txt 这是一个 non-existent 文件

基于上述行为,它将单独打印 b.txt 的内容,因为提供了 1 个参数。

但它没有找到文件 b.txt,所以它输出一条错误消息。

当您键入:

cat < a.txt b.txt a.txt

在内部,它是这样工作的:

  • STDIN 填充了 a.txt HELLO text
  • 的内容
  • $1(第一个参数)是 b.txt 这是一个 non-existent 文件
  • $2(第二个参数)是 a.txt

将输出:(再次忽略 STDIN,因为有 2 个参数)

cat: b.txt: No such file or directory
HELLO

更详细的解释

  • 当你运行命令mycommand arg1 arg2 arg3时,这意味着有3个命令行参数:分别为arg1arg2arg3
  • STDIN 是标准输入:用于将输入发送到命令的数据流。您可以像这样将数据发送到 STDIN(假设目标命令是 cat):
    • echo "my data" | cat
    • 制作名为data.txt的文件,填充my data,保存,然后使用cat < data.txt