繁体   English   中英

Linux cat 命令和错误

[英]Linux cat command and errors

我正在尝试 linux 重定向。 我有一个目录,其中只有一个文件 - 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? 我尝试了不同的组合 - 在 b.txt 之前/之后多次输入 a.txt 并看到一个模式,但无法弄清楚原因。

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

我假设您没有以正确的方式使用 cat 。 Cat 期望一个文件或多个文件作为参数而不是数据 stream。

使用 cat 显示文件:

cat a.txt

将其重定向到文件 b.txt

cat a.txt > b.txt

你的最后一个问题是模式。

您将 3 arguments 传递给 cat。

Arg1: ( < a.txt ) Arg2: ( a.txt ) Arg3: ( b.txt )

参数 1 是废话 参数 2 是有效文件,参数 3 是不正确的文件。

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

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

为什么我在尝试 cat < a.txt b.txt 时没有看到 HELLO?

man cat

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

因为给定 arguments,cat 没有从标准输入读取 - 标准输入被忽略。 相反,它从 arguments 上的给定FILE读取。 所以标准输入上的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

output:

HELLO

示例 2:

cat (然后输入)

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

回答

所以当你输入:

cat < a.txt b.txt

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

  • STDIN 填充了 a.txt HELLO文本的内容
  • $1(第一个参数)是b.txt ,它是一个不存在的文件

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

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

当您键入:

cat < a.txt b.txt a.txt

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

  • STDIN 填充了 a.txt HELLO文本的内容
  • $1(第一个参数)是b.txt ,它是一个不存在的文件
  • $2(第二个参数)是a.txt

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

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

更详细的解释

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM