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 没有从标准输入中读取 - 标准输入被忽略。相反,它从给定的 FILE
s 中读取参数。所以标准输入上的 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个命令行参数:分别为arg1
、arg2
、arg3
- STDIN 是标准输入:用于将输入发送到命令的数据流。您可以像这样将数据发送到 STDIN(假设目标命令是
cat
):
echo "my data" | cat
- 制作名为data.txt的文件,填充
my data
,保存,然后使用cat < data.txt
我正在尝试 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 没有从标准输入中读取 - 标准输入被忽略。相反,它从给定的 FILE
s 中读取参数。所以标准输入上的 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个命令行参数:分别为arg1
、arg2
、arg3
- STDIN 是标准输入:用于将输入发送到命令的数据流。您可以像这样将数据发送到 STDIN(假设目标命令是
cat
):echo "my data" | cat
- 制作名为data.txt的文件,填充
my data
,保存,然后使用cat < data.txt