Shell 输入/输入重定向

大大都 UNIX 体系号令从你的终端接管输入并将所发生的输入发送回​​到您的终端。一个号令凡是从一个叫规范输入的处所读取输入,默许环境下,这刚好是你的终端。一样,一个号令凡是将其输入写入到规范输入,默许环境下,这也是你的终端。

重定向号令列表以下:

号令 申明
command > file 将输入重定向到 file。
command < file 将输入重定向到 file。
command >> file 将输入以追加的体例重定向到 file。
n > file 将文件描写符为 n 的文件重定向到 file。
n >> file 将文件描写符为 n 的文件以追加的体例重定向到 file。
n >& m 将输入文件 m 和 n 归并。
n <& m 将输入文件 m 和 n 归并。
<< tag 将起头标记 tag 和竣事标记 tag 之间的内容作为输入。

须要注重的是文件描写符 0 凡是是规范输入(STDIN),1 是规范输入(STDOUT),2 是规范毛病输入(STDERR)。


输入重定向

重定向普通经由过程在号令间拔出特定的标记来完成。出格的,这些标记的语法以下所示:

command1 > file1

下面这个号令履行command1而后将输入的内容存入file1。

注重任何file1内的已存在的内容将被新内容替代。若是要将新内容增加在文件开端,请利用>>操纵符。

实例

履行下面的 who 号令,它将号令的完全的输入重定向在用户文件中(users):

$ who > users

履行后,并不在终端输入信息,这是由于输入已被从默许的规范输入装备(终端)重定向到指定的文件。

你能够利用 cat 号令检查文件内容:

$ cat users
_mbsetupuser console  Oct 31 17:35 
tianqixin    console  Oct 31 17:35 
tianqixin    ttys000  Dec  1 11:33 

输入重定向会笼盖文件内容,请看下面的例子:

$ echo "【WEB手艺大学】教程:xfitphysio.com" > users
$ cat users
【WEB手艺大学】教程:xfitphysio.com
$

若是不但愿文件内容被笼盖,能够利用 >> 追加到文件开端,比方:

$ echo "【WEB手艺大学】教程:xfitphysio.com" >> users
$ cat users
【WEB手艺大学】教程:xfitphysio.com
【WEB手艺大学】教程:xfitphysio.com
$

输入重定向

和输入重定向一样,Unix 号令也能够从文件获得输入,语法为:

command1 < file1

如许,原来须要从键盘获得输入的号令会转移到文件读取内容。

注重:输入重定向是大于号(>),输入重定向是小于号(<)。

实例

接着以上实例,咱们须要统计 users 文件的行数,履行以下号令:

$ wc -l users
       2 users

也能够将输入重定向到 users 文件:

$  wc -l < users
       2 

注重:下面两个例子的成果差别:第一个例子,会输入文件名;第二个不会,由于它仅仅晓得从规范输入读取内容。

command1 < infile > outfile

同时替代输入和输入,履行command1,从文件infile读取内容,而后将输入写入到outfile中。

重定向深切讲授

普通环境下,每一个 Unix/Linux 号令运转时城市翻开三个文件:

  • 规范输入文件(stdin):stdin的文件描写符为0,Unix法式默许从stdin读取数据。
  • 规范输入文件(stdout):stdout 的文件描写符为1,Unix法式默许向stdout输入数据。
  • 规范毛病文件(stderr):stderr的文件描写符为2,Unix法式会向stderr流中写入毛病信息。

默许环境下,command > file 将 stdout 重定向到 file,command < file 将stdin 重定向到 file。

若是但愿 stderr 重定向到 file,能够如许写:

$ command 2 > file

若是但愿 stderr 追加到 file 文件开端,能够如许写:

$ command 2 >> file

2 表现规范毛病文件(stderr)。

若是但愿将 stdout 和 stderr 归并后重定向到 file,能够如许写:

$ command > file 2>&1

或

$ command >> file 2>&1

若是但愿对 stdin 和 stdout 都重定向,能够如许写:

$ command < file1 >file2

command 号令将 stdin 重定向到 file1,将 stdout 重定向到 file2。


Here Document

Here Document 是 Shell 中的一种特别的重定向体例,用来将输入重定向到一个交互式 Shell 剧本或法式。

它的根基的情势以下:

command << delimiter
    document
delimiter

它的感化是将两个 delimiter 之间的内容(document) 作为输入通报给 command。

注重:

  • 开头的delimiter 必然要顶格写,前面不能有任何字符,前面也不能有任何字符,包罗空格和 tab 缩进。
  • 起头的delimiter前后的空格会被疏忽掉。

实例

在号令行中经由过程 wc -l 号令计较 Here Document 的行数:

$ wc -l << EOF
    接待离开
    【WEB手艺大学】教程
    xfitphysio.com
EOF
3          # 输入成果为 3 行
$

咱们也能够将 Here Document 用在剧本中,比方:

#!/bin/bash
# author:【WEB手艺大学】教程
# url:xfitphysio.com

cat << EOF
接待离开
【WEB手艺大学】教程
xfitphysio.com
EOF

履行以上剧本,输入成果:

接待离开
【WEB手艺大学】教程
xfitphysio.com

/dev/null 文件

若是但愿履行某个号令,但又不但愿在屏幕上显现输入成果,那末能够将输入重定向到 /dev/null:

$ command > /dev/null

/dev/null 是一个特别的文件,写入到它的内容城市被抛弃;若是测验考试从该文件读取内容,那末甚么也读不到。可是 /dev/null 文件很是有效,将号令的输入重定向到它,会起到"制止输入"的结果。

若是但愿屏障 stdout 和 stderr,能够如许写:

$ command > /dev/null 2>&1

注重:0 是规范输入(STDIN),1 是规范输入(STDOUT),2 是规范毛病输入(STDERR)。