我经常在网上看到用不同符号连接各种命令的教程。例如:
command1 | command2
command1 & command2
command1 || command2
command1 && command2
Run Code Online (Sandbox Code Playgroud)
其他人似乎将命令连接到文件:
command1 > file1
command1 >> file1
Run Code Online (Sandbox Code Playgroud)
这些是什么?他们叫什么?他们在做什么?还有更多吗?
可能的重复:
如何使 iconv 用转换后的输出替换输入文件?
我经常使用他们的公共 DNS 名称
( ec2-12-34-56-78.compute-1.amazonaws.com
)连接到 amazon ec2 ,因此我的known_hosts
文件被大量ec2
我永远不会再使用的条目所淹没。
我知道我可能可以sed -i
用来就地编辑,但我想使用grep
,所以我这样做了:
grep -v ec2 ~/.ssh/known_hosts > ~/.ssh/known_hosts
Run Code Online (Sandbox Code Playgroud)
这留下known_hosts
了一个空文件。如果我做:
grep -v ec2 ~/.ssh/known_hosts > ~/.ssh/tmp
mv ~/.ssh/tmp ~/.ssh/known_hosts
Run Code Online (Sandbox Code Playgroud)
然后一切都很好,但我很困惑,为什么读取和写入同一个文件的叶子空白的,如果有迂回方式,使用的时候grep
,cat
等等。
1. 考虑片段#1:
$ cat test.txt > test.txt
cat: test.txt: input file is output file
Run Code Online (Sandbox Code Playgroud)
似乎cat
使它的输入文件描述符指向 test.txt,然后当它尝试将其输出文件描述符设置为 test.txt 时,它会引发上述错误。这里似乎cat
知道重定向运算符,因此继续尝试将输出文件描述符设置为 test.txt
2. 考虑片段#2:
$ cat 1.txt
1:CAT
2:dog
$ sed 's/cat/CAT/g' test.txt
1:CAT
2:dog
$ sed 's/cat/CAT/g' test.txt > test.txt
$ cat test.txt # Note that test.txt is now empty
$
Run Code Online (Sandbox Code Playgroud)
在这里我们看到sed
以读取模式打开 test.txt(最后一个参数)并同时设置test.txt
为其文件输出描述符。此外,'>'
操作员会在sed
开始读取文件之前覆盖文件的内容。
我知道管道中的命令并行执行,但没有遇到有关重定向运算符行为方式的任何信息。任何支持链接都会有所帮助。
此处不允许重定向。是cat
不允许吗?但是重定向不是独立于运行它的任何命令吗?
$ cat bk > bk
cat: bk: input file is output file
Run Code Online (Sandbox Code Playgroud)为什么以下重定向会清空文件:
$ less bk > bk
Run Code Online (Sandbox Code Playgroud)
awk
也less
以与重定向类似的方式工作。awk
是我真正发现问题的那个,而上面的例子毫无意义
一般来说,使用重定向的正确方法是什么?