linuxshell输⼊输出重定向
shell 在执⾏⼀个命令时,始终会打开三个⽂件,标准输⼊⽂件(stdin)、标准输出⽂件(stdout)、标准错误输出⽂件(stderr)。标准输⼊⽂件对应键盘、⿏标等输⼊设备;标准输出⽂件和标准错误⽂件对应显⽰器等输出设备。shell 启动的进程将从标准输⼊⽂件中得到输⼊数据,将正常输出数据输出到标准输出⽂件,⽽将错误信息送到标准错误⽂件。
在类 unix 系统中,系统为每⼀个打开的⽂件指定⼀个⽂件描述符(file descriptor)以便系统对⽂件进⾏跟踪。⽂件描述符和 c 语⾔的⽂件句柄相似,⽂件描述符是⼀个⾮负整数,不同数字代表不同的含义。默认情况下,系统使⽤了三个,分别是 0、1、2。⽽ 3 - 9 是保留的⽂件描述符。
0/1/2 ⽂件描述符和⽂件的对应关系
⽂件描述符⽂件⽂件对应的设备
0标准输⼊⽂件 standard input keyboard、mouse
1标准输出⽂件 standard output monitor
2标准错误输出⽂件 standard error monitor
输⼊、输出重定向是⼀个过程,它捕捉⼀个⽂件、命令、程序、脚本、或者脚本中的代码块的输出(输⼊重定向),把捕捉到的输出作为输⼊发送给另外⼀个⽂件、命令、程序、脚本(输出重定向)。
标准输⼊重定向把⽂件、命令、程序、脚本的标准输⼊重定向到指定的⽂件中。也就是说,输⼊可以不来⾃键盘,⽽来⾃⼀个指定的⽂件。所以说,标准输⼊重定向主要⽤于改变⼀个命令的输⼊源,特别是改变那些需要⼤量输⼊的输⼊源。
标准输出重定向把⽂件、命令、程序、脚本的标准输出重定向到指定的⽂件中。这样就不必输出到显⽰器,⽽可以输出到⼀个指定的⽂件。
简单的标准输⼊输出重定向操作
重定向操作描述
command < file标准输⼊重定向,command 从 file 中输⼊
command > file标准输出重定向,command 的结果输出到 file 中
command >> file标准输出重定向,command 的结果输出到 file 中
对于标准输出重定向来说,如果⽂件不存在,则⽣成⽂件,并将命令的输出写⼊到⽂件中。如果⽂件存在,> 重定向操作符将命令的输出覆盖⽂件的原有内
容;⽽ >> 重定向操作符将命令的输出追加到⽂件的末尾。
⽰例 1
输⼊输出重定向
输⼊输出重定向描述
[n]<file重定向输⼊
[n]>file重定向输出
[n]>>file追加重定向输出
&>file重定向标准输出和标准错误输出
>&file重定向标准输出和标准错误输出
>file 2>&1重定向标准输出和标准错误输出
&>>file追加重定向标准输出和标准错误输出
>>file 2>&1追加重定向标准输出和标准错误输出
command <<[-] here_limit_string here ⽂档
command <<< string here 字符串
[n]<>file以读写⽅式打开⽂件描述符
[n]<&-关闭输⼊⽂件描述符
[n]>&-关闭输出⽂件描述符
[n]<&digit复制输⼊⽂件描述符
[n]>&digit复制输出⽂件描述符
[n]<&digit-移动输⼊⽂件描述符
[n]>&digit-移动输出⽂件描述符
重定向输⼊(redirecting input)
输⼊重定向引起⽂件(file 进⾏ shell 展开的结果)以读⽅式被打开,从⽂件描述符 n 输⼊的内容被定向为从⽂件读⼊。
语法格式如下:
[n]<file
1 以读⽅式打开⽂件,并为⽂件分配⽂件描述符 n。
2 如果省略 n,则⽂件描述符为 0(即标准输⼊)。
3 注意 < 前后不能有空格;当 n 省略时,< 前后允许有空格。
重定向输出(redirecting output)
输出重定向引起⽂件(file 进⾏ shell 展开的结果)以写⽅式被打开,输出到⽂件描述符 n 的内容被定向为写⼊到⽂件。即重定向⽂件描述符 n 到⽂件。语法格式如下:
[n]>file
1 以写⽅式打开⽂件,并为⽂件分配⽂件描述符 n。
2 如果省略 n,则⽂件描述符为 1(即标准输出)。
3 如果⽂件不存在,则创建⽂件;否则⽂件内容将被覆盖。
4 注意 > 前后不能有空格;当 n 省略时,> 前后允许有空格。
追加重定向输出(appending redirected output)
语法格式如下:
[n]>>file
1 以追加写⽅式打开⽂件,并为⽂件分配⽂件描述符 n。
2 >> 和 > ⼀样,只是向⽂件写⼊内容的⽅式不⼀样。前者当⽂件存在时向⽂件追加内容;后者当⽂件存在时覆盖⽂件原有内容。
3 注意 >> 前后不能有空格;当 n 省略时,>> 前后允许有空格。
⽰例 2
重定向标准输出和标准错误输出(redirecting standard output and standard error)
shell 允许标准输出(⽂件描述符为 1)和标准错误输出(⽂件描述符为 2)重定向到⽂件。
语法格式如下:
&>file
或者
>&file
等同于
>file 2>&1
1 ⽂件为 file 进⾏ shell 展开的结果。
2 两种形式在语法上是等同的,但提倡采⽤第⼀种⽅式。
3 如果⽂件不存在,则创建⽂件;否则⽂件内容将被覆盖。
4 &>file 和 >&file 在语法形式等同于 >file 2>&1。
追加重定向标准输出和标准错误输出(appending standard output and standard error)
shell 允许标准输出(⽂件描述符为 1)和标准错误输出(⽂件描述符为 2)以追加⽅式重定向到⽂件。
语法格式如下:
&>>file
等同于
>>file 2>&1
1 当⽂件不存在时,则创建⽂件;当⽂件存在时,则向⽂件追加内容。
⽰例 3
here documents
这种类型的重定向指⽰ shell 从当前来源读输⼊直到出现仅包含 here_limit_string 的⼀⾏。
详细描述请参考《shell here ⽂档》。
语法格式如下:
command <<[-] here_limit_string
...
...
here_limit_string
here strings
字符串(string 进⾏ shell 展开的结果)作为输⼊(代替标准输⼊)提供给命令。
详细描述请参考《shell here ⽂档》。
语法格式如下:
linux循环执行命令脚本command <<< string
以读写⽅式打开⽂件描述符(opening file descriptors for reading and writing)
输⼊输出重定向引起⽂件(file 进⾏ shell 展开的结果)在指定⽂件描述符处以读写⽅式被打开。语法格式如下:
[n]<>file
1 以读写⽅式打开⽂件,并为⽂件分配⽂件描述符 n。
2 如果省略 n,则⽂件描述符为 0(即标准输⼊)。
3 如果⽂件不存在,则创建⽂件。
4 实际可以这样理解,为了读写⽂件,把⽂件打开,并分配⽂件描述符 n 给⽂件。
关闭⽂件描述符(close file descriptors)
语法格式如下:
[n]<&-
1 表⽰关闭输⼊⽂件描述符 n。
2 如果省略 n,则⽂件描述符为 0(即标准输⼊)。
语法格式如下:
[n]>&-
1 表⽰关闭输出⽂件描述符 n。
2 如果省略 n,则⽂件描述符为 1(即标准输出)。
⽰例 4
test.sh ⽂件的内容如下
echo 123456789 >
# open file descriptor
exec 3<&
read -n 4 <&3
echo -n . >&3
# close file descriptor
exec 3>&-
number=$(cat < )
echo number=$number
在命令提⽰符下输⼊ ./test.sh,执⾏结果如下:
number=1234.6789
复制⽂件描述符(duplicating file descriptors)
shell 允许将⼀个⽂件描述符复制到另外⼀个⽂件描述符,这样两个⽂件描述符将指向同⼀个⽂件。
语法格式如下:
[n]<&digit
1 将⽂件描述符 digit 复制到⽂件描述符 n(如果省略 n,则⽂件描述符为 0(即标准输⼊))。从⽂件描述符 n 输⼊都将重定向为从⽂件描述符 digit 输⼊。
2 digit 是⼀个数字。
语法格式如下:
[n]>&digit
1 将⽂件描述符 digit 复制到⽂件描述符 n(如果省略 n,则⽂件描述符为 1(即标准输出))。输出到⽂件描述符 n 的内容都将重定向输出到⽂件描述符digit。
2 digit 是⼀个数字。
⽰例 5
test.sh ⽂件的内容如下
echo "abc" > 1.txt
echo "def" > 2.txt
# open file descriptor
exec 3&
exec 4&
# duplicate file descriptor
exec 3<&4
echo "ghi" >> 2.txt
cat <&3
在命令提⽰符下输⼊ ./test.sh,执⾏结果如下:
def
ghi
⽰例 6
test.sh ⽂件的内容如下
echo "abc" > 1.txt
echo "def" > 2.txt
# open file descriptor
exec 3<&
exec 4<&
# duplicate file descriptor
exec 3>&4
read -n 2 <&3
echo "ghi" >&3
# close file descriptor
exec 3>&-
exec 4>&-
content1=$()
content2=$()
echo content1=$content1
echo content2=$content2
在命令提⽰符下输⼊ ./test.sh,执⾏结果如下:
content1=abc
content2=deghi
移动⽂件描述符(moving file descriptors)
shell 允许将⼀个⽂件描述符移动到另外⼀个⽂件描述符。
shell 在将⼀个⽂件描述符复制到另外⼀个⽂件描述符之后,将原来的⽂件描述符关闭。
语法格式如下:
[n]<&digit-
1 将⽂件描述符 digit 移动到⽂件描述符 n(如果省略 n,则⽂件描述符为 0(即标准输⼊))。
2 ⽂件描述符将复制到⽂件描述符 n,之后⽂件描述符 digit 将关闭。⽂件描述符 digit 将不能再使⽤,否则会出错。
3 digit 是⼀个数字。
语法格式如下:
[n]>&digit-
1 将⽂件描述符 digit 移动到⽂件描述符 n(如果省略 n,则⽂件描述符为 1(即标准输出))。
2 ⽂件描述符将复制到⽂件描述符 n,之后⽂件描述符 digit 将关闭。⽂件描述符 digit 将不能再使⽤,否则会出错。
3 digit 是⼀个数字。
⽰例 7
test.sh ⽂件的内容如下
echo "abc" > 1.txt
echo "def" > 2.txt
# open file descriptor
exec 3<&
exec 4<&
# duplicate file descriptor
exec 3>&4-
read -n 2 <&3
echo "ghi" >&3
read -n 2 <&4
echo "ghi" >&4
content1=$()
content2=$()
echo content1=$content1
echo content2=$content2
在命令提⽰符下输⼊ ./test.sh,执⾏结果如下:
./test.sh: line 14: 4: wrong file descriptor
./test.sh: line 15: 4: wrong file descriptor
content1=abc
content2=deghi
exec 命令和输⼊输出重定向
在默认情况下,shell 执⾏完重定向命令后,会⾃动 reset(输⼊、输出将恢复到标准输⼊、标准输出)。这样下⾯的命令将不会在进⾏重定向操作。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论