输出重定向
cat /etc/profile
可以在终端输出文件内容,如果我们想将输出的文件内容放到一个文件里,那么就需要将输出重定向这个文件,输出重定向符>可以帮我们做到这一点。
cat /etc/profile > /tmp/profile.txt
将左侧的输出重定向至右侧的文件。输出重定向时会覆盖输出,即右侧文件原来的内容会被覆盖。
还有>>
, 2>
, &>
可以进行输出重定向,与>
含义略有区别,我举例说明他们的含义:
cat /etc/profile >> /tmp/profile.txt
左侧输出的内容重定向至右侧的文件,输出重定向时进行追加输出,即在右侧文件已有内容后面追加内容。
bash 1.sh 2> /tmp/1.txt
执行左侧命令的过程中,将产生的错误信息输出重定向至右侧的文件
bash 1.sh &> /tmp/1.txt
执行1.sh过程中产生的正确信息和错误信息都输出到文件
由此,可以概括一下输出重定向的基本格式:
{产生输出的命令} > {输出文件}
输出重定向符可以是>
,>>
,2>
,&>
输入重定向
与输出重定向不同,输入重定向使用符号<
,输入重定向时会将<右侧内容作为左侧的输入。
先使用read
命令了解一下输入。read var
在终端输入该命令后回车,可以在终端输入内容,输完内容后再次按回车结束输入。此时变量var
的值就是刚才输入的内容,可以在终端执行命令echo $var
显示刚才的输入。
如果我们想某个文件的内容作为输入时(假设a.txt
中只有一行hello
字符串),就可以使用输入重定向<
,在终端执行下面的命令
read var < a.txt
然后再打印变量echo $var
,可以在终端看到输出了hello
。(注意:<右侧是一个文件名a.txt
,不是cat a.txt
)
输入重定向还可以使用<<
,相比于<
符号的右侧是文件名,<<
符号右侧的则是一个标记内容,进行command << tag
输入重定向时,遇到tag
则结束输入。请看下面的示例:
# read var << abc
> xyz
> 123
> abc
# echo $var
xyz
(# 表示终端输入命令,>表示进入交互模式)
这个示例中,先在终端执行命令read var << abc
(这意味着当遇到abc时结束输入),按回车后进入交互模式,此时可以输入任何内容了,从示例中我们看到了先是输入了xyz
,回车然后输入了123
,回车然后输入了abc
,再按回车退出交互模式回到终端。(可以看到执行命令后就能一直输入了,直到输入了abc
标记就结束了输入)。在终端执行echo $var
命令,可以看到第一次输入的xyz
作为了变量var
的值。
总结一下输入重定向:
{有输入的命令} < {文件}
{有输入的命令} << {结束标记}
在linux下通常使用的结束标记是EOF,在新的一行开头按下Ctrl+D就代表了EOF(参见阮一峰博客:EOF是什么)。
我在刚了解重定向时,就难以理解输出重定向,例如:cat /etc/profile >> /tmp/profile.txt
按照我原先的理解,左侧产生的内容会存入右侧的文件,我的关注点在>>的右侧文件中,所以我潜意识里认为它应该是一个“输入”,我错误的认为左侧产生的内容”输入“至右侧文件。应该关注左侧的命令,左侧的命令会输出内容,输出重定向符会将输出的内容重定向至文件。