cat连接文件或stdin并将其重定向到stdout。
$ cat file1 > file5 file2 file3 file4
连接file1,file2,file3和file 4并将其写入file5。
$ cat file1 > file5 < file2 file3 file4
连接file1,file3和file4(不是file2)并写入file5
请解释这些输出
发生的事情的例子:
~/test$ echo "this is file 1"> file1
~/test$ echo "this is file 2"> file2
~/test$ echo "this is file 3"> file3
~/test$ echo "this is file 4">file4
~/test$ cat file1 > file5 file2 file3 file4
~/test$ cat file5
this is file 1
this is file 2
this is file 3
this is file 4
~/test$ cat file1 > file5 < file2 file3 file4
~/test$ cat file5
this is file 1
this is file 3
this is file 4
答案 0 :(得分:2)
这不是关于cat
的工作原理,而是关于shell重定向的更多信息。 shell在运行程序之前处理命令行。您可以更轻松地查看是否将所有io重定向推送到命令的末尾。第一个成为:
cat file1 file2 file3 file4 > file5
shell然后将cat的输出从终端更改为file5。 这完全独立于猫。
然后第二个命令是
cat file1 file3 file4 >file5 <file2
这会将键盘的标准输入更改为file2
,将输出更改为file5。在这种情况下,因为在命令行上指定了文件,cat忽略标准输入,只读取1,3和4. -
参数告诉cat从标准输入读取,所以
cat file1 - file3 file4 >file5 < file2
将文件1-4的内容输出到文件5.
答案 1 :(得分:1)
shell中只发生一次重定向;其余的作为参数传递。
第一个命令是
cat file1 file2 file3 file4 > file5
第二个命令是
cat file1 file3 file4 > file5 < file2
第二个命令不包括file2
,因为cat
从未被告知使用-
从标准输入读取。
答案 2 :(得分:1)
重定向可以放在命令行的任何位置,尽管通常的方法是在最后。
您的第二个陈述不正确。应该忽略file2。(稍后更正)
答案 3 :(得分:1)
尝试创建简单的bash文件
#!/bin/bash
echo $@
然后运行
./bash.sh file1 file2 file3 file4 > file5
给你
file1 file2 file3 file4
./bash.sh file1 file3 file4 >file5 <file2
给你
file1 file3 file4
在文件5中你看到参数列表,cat做的是获取参数列表并将其写入std输出,这就是为什么文件2被忽略,它不是参数,它实际上是一个输入
如果你想让cat从std输入中读取 - 在命令
之后cat file1 > file5 < file2 file3 file4 -
这将写
1111
3333
4444
2222
到file5
&LT;如果你写
,意味着重定向std输入cat file1 > file5 file3 file4 -
它从file1,file3和file4 和键盘读取到文件5