输入/输出重定向

前言:通常,我们会在终端输入一些命令,这些命令被系统处理了之后,系统又通过在终端显示的方式将输出结果呈现给我们,输入和输出都是终端;而重定向,就是指定输入/输出到某个文件,而不再是终端;

1.command > file

command是指一个命令,上面这个命令执行command然后将输出的内容存入file。

注意:任何file内的已经存在的内容将被新内容替代。

举例:

test.sh中有如下内容:

$ cat test.sh 
:<<?
WOSHIHAODE
?
echo "我是ren"

现在执行这个命令:

$ ls > test.sh 

执行后,并没有在终端输出信息,这是因为输出已被从默认的标准输出设备(终端)重定向到指定的文件。

再来看一下test.sh中的内容:

$ cat test.sh 
Activity启动模式
adb命令
AMS数据结构
AS笔记
Linux笔记
Shell
Test
test.sh
Vi笔记
工作笔记
记录
开发笔记

再举一个例子:

$ echo "wo shi ren" > test.sh
$ cat test.sh 
wo shi ren

从上面得知,输出重定向会覆盖文件内容,如果不希望文件内容被覆盖,可以使用 >> 追加到文件末尾;

 

2.command >> file

将输出重定向追加到文件末尾,而不是覆盖文件内容,如:

$ cat test.sh 
wo shi ren
$ echo "jintian shangban" >> test.sh 
$ cat test.sh 
wo shi ren
jintian shangban

 

3.command < file

1和2是输出重定向,现在看一下输入重定向,输入重定向指的是本来需要从键盘获取输入的命令会转移到文件读取内容。

先看看什么是键盘输入:

$ cat > test
testing
haha 

$ cat test 
testing
haha

由于加入>在cat之后,所以那个test文件会被主动创建,而内容就是刚才键盘上面输入的那两行数据了。那能不能用某个文件的内容来代替键盘的敲击呢?

~$ cat > test2 < test 
~$ cat test2 
testing
haha

可以看到,test2和test中的内容完全一致;

 

4.command < infile > outfile

执行command,从文件infile读取内容,然后将输出写入到outfile中。

 

5.n > file,n >& m,n <& m,n >> file,<< tag

n > file:将文件描述符为 n 的文件重定向到 file。

n >& m:将输出文件 m 和 n 合并。

n <& m:将输入文件 m 和 n 合并。

n >> file:将文件描述符为 n 的文件以追加的方式重定向到 file。

<< tag:将开始标记 tag 和结束标记 tag 之间的内容作为输入。

这个m,n是什么?

一般情况下,每个 Unix/Linux 命令运行时都会打开三个文件:

标准输入文件(stdin):stdin的文件描述符为0,Unix程序默认从stdin读取数据。

标准输出文件(stdout):stdout 的文件描述符为1,Unix程序默认向stdout输出数据。

标准错误文件(stderr):stderr的文件描述符为2,Unix程序会向stderr流中写入错误信息。

从标准输入文件读取数据,经过处理之后,再将标准输出文件或标准错误文件输出到屏幕上;

所以,m和n指的就是stdin,stdout 和stderr;

默认情况下,command > file 将 stdout 重定向到 file,command < file 将stdin 重定向到 file。

(1)如果希望 stderr 重定向到 file,可以这样写:

$ command 2 > file

如果希望 stderr 追加到 file 文件末尾,可以这样写:

$ command 2 >> file

注意:2 表示标准错误文件(stderr),错误文件的重定向是2>>,而正确文件的重定向是1>>,这个1可以省略,也就是>>;

 

(2)如果希望将 stdout 和 stderr 合并后重定向到 file,可以这样写:

$ command > file 2>&1

或者

$ command >& file

 

(3)如果希望对 stdin 和 stdout 都重定向,可以这样写:

$ command < file >file

这个和上面的command < infile > outfile是相同的意思;

 

(4)将stdout 和 stderr 分别重定向到不同的 file:

~$ cat ./iei.sh > right 2> error

其中,right和error是两个文件,都cat ./iei.sh指令报错的时候,报错信息会被写到error中,如果指令正确,输出结果会被写到right文件中;

 

6.Here Document (重点注意)

Here Document 是 Shell 中的一种特殊的重定向方式,用来将输入重定向到一个交互式 Shell 脚本或程序。

它的基本的形式如下:

command << delimiter
    document
delimiter

上面我们分析了>,>>,<的含义,却一直没有分析<<,因为>,>>,<代表了重定向,而<<表示结束输入的意思,它后面会接一个分隔符,也叫结束符;

delimiter表示分隔符,它的作用是将两个 delimiter 之间的内容(document) 作为输入传递给 command。

注意:结尾的delimiter 一定要顶格写,前面不能有任何字符,后面也不能有任何字符,包括空格和 tab 缩进;开始的delimiter前后的空格会被忽略掉。

举个例子:

$ cat test.sh 
cat << EOF
    今天是周一;
    上班第一天;
    哈哈
EOF
$ ./test.sh 
    今天是周一;
    上班第一天;
    哈哈

EOF是END Of File的缩写,表示自定义终止符,既然自定义,那么EOF就不是固定的,可以随意设置别名,如:

$ cat test.sh 
cat << BB
    今天是周一;
    上班第一天;
    哈哈
BB
$ ./test.sh 
    今天是周一;
    上班第一天;
    哈哈

将BB替换成EOF也是可以运行的,但是可读性较差,推荐写成EOF;

EOF一般是和cat一起用的,既然是一种特殊的重定向方式,那追加功能也是有的,如:

$ cat test.sh 
cat << BB
    今天是周一;
    上班第一天;
    哈哈
BB

$ cat >> test.sh  <<EOF
> jin tian tian qi bu cuo
> xiang chu qu wan
> wq
> EOF

$ cat test.sh 
cat << BB
    今天是周一;
    上班第一天;
    哈哈
BB
jin tian bu buxiang shangban
jiahn
jin tian tian qi bu cuo
xiang chu qu wan
wq

以上的脚本命令是,在test.sh文件后面加上了几行代码。

 

7./dev/null 文件

如果希望执行某个命令,但又不希望在屏幕上显示输出结果,那么可以将输出重定向到 /dev/null:

$ command > /dev/null

/dev/null 是一个特殊的文件,写入到它的内容都会被丢弃;如果尝试从该文件读取内容,那么什么也读不到。但是 /dev/null 文件非常有用,将命令的输出重定向到它,会起到"禁止输出"的效果。

如果希望屏蔽 stdout 和 stderr,可以这样写:

$ command > /dev/null 2>&1

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

renshuguo123723

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值