一、标准输入输出
对于shell
来说,有三个基础的流,标准输入流(stdin或者stream 0),标准输出流(stdout或者stream 1),标准错误流(stderr或者stream2)。
举个例子,当我们用键盘在shell
中执行命令的时候,可以如下图:
通常,stdout跟stderr都输出到了屏幕上,但对于Linux来说,其实是两种不同的输出。
二、输出重定向
可以用>
大于号将stdout重定向到另一个IO,比如文件:
# echo "hello" > test.log # cat test.log hello
上面的命令将stdout重定向到文件test.log
中,此时,如果该文件不存在则创建新文件,如果存在则覆盖已有文件。事实上,>
重定向是1>
的简写,1>
可以更清楚的看到实际上是把stdout(stream 1)重定向。
必须注意的是,默认情况下,该重定向会覆盖已有文件,这个在有时候可能不经意间丢失重要数据。shell
提供了选项使得我们可以禁止这种覆盖,set -o noclobber
可以打开该选项。
# cat test.log hello # set -o noclobber # echo "world" > test.log -bash: test.log: cannot overwrite existing file
此外,在打开该选项之后,其实还是可以强制执行覆盖,可以采用>|
来强制重定向到已存在的文件:
# echo "world" > test.log -bash: test.log: cannot overwrite existing file # echo "world" >| test.log # cat test.log world
三、追加输出
可以采用>>
将输出重定向到文件并追加在文件结尾,这样就可以避免覆盖文件了。
# cat test.log world # echo hello >> test.log # cat test.log world hello
四、输入重定向
可以采用 <
将输入重定向,<
其实是 0<
的简写。
# cat <stdout.log
还可以<<EOF
通过手动输入直到输入EOF
<<< 可以直接将一个字符串重定向给输入
# base64 <<< hello