标准输入和输出

时间:2019-04-16 23:59:05  来源:igfitidea点击:

几乎所有的命令都将输出显示到屏幕上,或者从键盘上获取输入,但是在Linux中,可以将输出发送到文件中,或者从文件中读取输入。每个shell命令都有自己的输入和输出。在执行命令之前,可以使用shell的特殊符号重定向命令的输入和输出。

例如,将date命令的输出发送到文件而不是屏幕。更改输入或输出的默认路径称为重定向

在Linux中,一切都是文件。
你的硬件也是一个文件:
0 -输入-键盘(stdin)
1 -输出-屏幕(标准输出)
2 -错误-屏幕(stderr)
以上三个数字是标准的POSIX数字,也称为文件描述符(FD)。每个Linux命令至少打开一个上面的流,以便与用户或其他系统程序进行对话。

linux标准输入输出

标准文件描述符数字含义示例
stdin0从文件中读取输入(默认是从键盘)
stdout1将数据发送到一个文件(默认是screen)。
stderr2将所有错误消息发送到一个文件(默认是screen)。

Linux标准输入 stdin

  1. 标准输入是默认的输入方法,所有命令都使用它来读取输入。
  2. 用0表示。
  3. 也被称为stdin。
  4. 默认的标准输入是键盘。
  5. <是输入重定向符号,语法为: command < filename

例如,你可以运行下面的cat命令来在屏幕上显示/etc/passwd的内容:

linux标准输入输出

cat < /etc/passwd

对/etc/resolv.conf文件进行排序:

sort < /etc/resolv.conf

Linux标准输出 stdout

一个命令使用标准输出来写(显示)它的输出。
默认是屏幕。
用1表示。
也被称为stdout。
默认的标准输出是屏幕。
>为输出重定向符号,语法为: command > output.file.name

例如,ls命令默认将输出写到屏幕上:

ls

但是,我们可以将输出保存到output.txt文件中:
如果/tmp/output.txt文件不存在,则会创建该文件。如果文件/tmp/output.txt存在,则会被覆盖。

ls > / tmp / output.txt

也可以将脚本输出保存到文件中:

./script.sh > myoutput
cat myoutput

标准输出的重定向

要重定向输出,只简单使用以下语法:

command > /path/to/file
/path/to/script.sh > output.txt

例如,将date命令的输出发送到now.txt文件中:

date > now.txt

你也可以用 >操作符来打印文件:

cat file.txt > /dev/lp0

或者

sudo bash -c "cat file.txt > /dev/lp0"

附加到重定向的输出中

可以使用 >>操作符将输出附加到相同的文件中

date >> now.txt
cat now.txt

也可以使用这样的语法

echo "今天是 $(date)" 1>>/tmp/now.txt

Linux标准错误 stderr

标准错误是默认的错误输出设备,用于写入所有系统错误消息。
它用数字2表示。
也被称为stderr。
默认的标准错误设备是显示器。
2>为输入重定向符号,语法为: command 2> errors.txt

例如,将find命令错误发送到fileerrors.txt文件。

find / -iname "*.conf" 2>fileerrors.txt
cat fileerrors.txt

标准错误的重定向

将标准错误重定向到文件error.log

command-name 2>error.log

在/home目录中查找所有的.profile文件,并将错误记录到/tmp/error文件中

find /home -name .profile 2>/tmp/error

重定向脚本错误

将脚本错误重定向到日志文件scripts.err:

./script.sh 2>scripts.err
/path/to/example.pl 2>scripts.err

附加到错误日志

还使用 >>操作符将标准错误追加到error.log文件的末尾:

command-name 2>>error.log
./script.sh 2>>error.log
/path/to/example.pl 2>>error.log

同时重定向标准输出和标准错误

使用下面语法将stdout和stderr都重定向到文件:

command-name &>filename
或者
command-name >cmd.log 2>&1
command-name >/dev/null 2>&1

它们常用于cron计划任务中。

@hourly /scripts/backup/nas.backup >/dev/null 2>&1

cron计划任务中的 >/dev/null 2>&1是什么意思
将标准输出和标准错误都重定向到 /de/null 。 即丢弃。