Linux I/O重定向
Unix 命令行的功能之一是使用输入/输出重定向和管道。在本次会议中,我们介绍了输入、输出和错误流的重定向。
Linux I/O重定向
标准输入、标准输出和标准错误
bash shell 具有三个基本流;它从 stdin(流 0)获取输入,将输出发送到 stdout(流 1),并将错误消息发送到 stderr(流 2)。
键盘通常用作标准输入,而标准输出和标准错误都连接到显示器。这可能会让 Linux 新用户感到困惑,因为没有明显的方法来识别 stdout 和 stderr。有经验的用户知道将输出与错误分开非常有用。
下一节将解释如何重定向这些流。
输出重定向
标准输出 (>)
stdout 可以使用大于号重定向。扫描该行时,shell 将看到 > 符号并清除文件。
事实上,> 符号是 1> 的缩写(stdout 被称为流 1)。
datasoft @ datasoft-linux ~/test10$ echo It is summer today!
It is summer today!
datasoft @ datasoft-linux ~/test10$ echo It is summer today! > summer.txt
datasoft @ datasoft-linux ~/test10$ cat summer.txt
It is summer today!
datasoft @ datasoft-linux ~/test10$
请注意,bash shell 在执行参数 0 之前有效地从命令行删除了重定向。这意味着在此命令的情况下:
datasoft @ datasoft-linux ~/test10$ echo Hei > greeting.txt
shell 只计算两个参数(echo = 参数 0,hello = 参数 1)。在参数计数发生之前重定向被删除。
输出文件被删除
扫描该行时,shell 将看到 > 符号并清除文件!由于这发生在解析参数 0 之前,这意味着即使命令失败,文件也将被清除!
datasoft @ datasoft-linux ~/test10$ cat summer.txt
It is summer today!
datasoft @ datasoft-linux ~/test10$ zcho It is summer today! > summer.txt
No command 'zcho' found, did you mean:
Command 'echo' from package 'coreutils' (main)
zcho: command not found
datasoft @ datasoft-linux ~/test10$ cat summer.txt
datasoft @ datasoft-linux ~/test10$
noclobber
过设置 noclobber 选项可以防止使用 > 时擦除文件。
datasoft @ datasoft-linux ~/test10$ cat summer.txt
datasoft @ datasoft-linux ~/test10$ set -o noclobber
datasoft @ datasoft-linux ~/test10$ echo It is cold today! > summer.txt
bash: summer.txt: cannot overwrite existing file
datasoft @ datasoft-linux ~/test10$ set +o noclobber
datasoft @ datasoft-linux ~/test10$
否决noclobber
noclobber 可以用 >| 来否决。
datasoft @ datasoft-linux ~/test10$ set -o noclobber
datasoft @ datasoft-linux ~/test10$ echo It is summer today! > summer.txt
bash: summer.txt: cannot overwrite existing file
datasoft @ datasoft-linux ~/test10$ echo It is summer today! >|summer.txt
datasoft @ datasoft-linux ~/test10$ cat summer.txt
It is summer today!
datasoft @ datasoft-linux ~/test10$
追加 (>>)
使用 >> 将输出附加到文件。
datasoft @ datasoft-linux ~/test10$ echo It is summer today! > summer.txt
bash: summer.txt: cannot overwrite existing file
datasoft @ datasoft-linux ~/test10$ cat summer.txt
It is summer today!
datasoft @ datasoft-linux ~/test10$ echo Where is the hot summer ? >> summer.txt
datasoft @ datasoft-linux ~/test10$ cat summer.txt
It is summer today!
Where is the hot summer ?
datasoft @ datasoft-linux ~/test10$
错误重定向
2> 标准错误
重定向 stderr 是通过 2> 完成的。这对于防止屏幕上出现错误消息非常有用。
下面的屏幕截图显示了 stdout 重定向到文件,stderr 重定向到 /dev/null。写 1> 与 > 相同。
datasoft @ datasoft-linux ~/test10$ find / > allfiles.txt 2> /dev/null
datasoft @ datasoft-linux ~/test10$
2>&1
要将 stdout 和 stderr 重定向到同一文件,请使用 2>&1。
datasoft @ datasoft-linux ~/test10$ find / > allfiles_and_error.txt 2>&1
请注意,重定向的顺序很重要。例如,命令
ls > dirlist 2>&1
将标准输出(文件描述符 1)和标准错误(文件描述符 2)定向到文件目录列表,而命令
仅将标准输出定向到文件 dirlist,因为标准错误在标准输出重定向到 dirlist 之前复制了标准输出。
输出重定向和管道
默认情况下,在命令行上使用管道时,无法在 stderr 内进行 grep,因为只传递了 stdout。
datasoft @ datasoft-linux ~/test10$ rm file35 file=10 | grep test
rm: cannot remove 'file35': No such file or directory
rm: cannot remove 'file=10': No such file or directory
datasoft @ datasoft-linux ~/test10$ rm file10 | grep.txt
使用 2>&1 您可以强制 stderr 转到 stdout。这使得管道中的下一个命令能够作用于两个流。
datasoft @ datasoft-linux ~/test10$ rm file35 file10 file101 2>&1 1>&2 | grep file35
rm: cannot remove 'file35': No such file or directory
datasoft @ datasoft-linux ~/test10$
您不能同时使用 1>&2 和 2>&1 来切换 stdout 和 stderr。
datasoft @ datasoft-linux /$ rm file35 file10 file101 2>&1 1>&2 | grep file35
rm: cannot remove 'file35': No such file or directory
datasoft @ datasoft-linux /$ echo file35 2>&1 1>&2 | sed 's/file35/FILE35/'
FILE35
您需要第三个流来在管道符号之后切换 stdout 和 stderr。
datasoft @ datasoft-linux /$ echo file35 2>&1 1>&2 | sed 's/file35/FILE35/'
FILE35
datasoft @ datasoft-linux /$ echo file35 3>&1 1>&2 2>&3 | sed 's/file35/FILE35/' file35
file35
sed: can't read file35: No such file or directory
datasoft @ datasoft-linux /$
连接 stdout 和 stderr
&> 构造会将 stdout 和 stderr 放入一个流中(到一个文件)。
datasoft @ datasoft-linux ~$ cd test10
datasoft @ datasoft-linux ~/test10$ rm file35 &> out_and_err
datasoft @ datasoft-linux ~/test10$ cat out_and_err
rm: cannot remove 'file35': No such file or directory
datasoft @ datasoft-linux ~/test10$ echo file35 &> out_and_err
bash: out_and_err: cannot overwrite existing file
datasoft @ datasoft-linux ~/test10$
输入重定向
标准输入(<)
重定向标准输入是通过 < (0< 的简写)完成的。
datasoft @ datasoft-linux ~$ cat < mno.txt
What is your name?
My name is prasanta.
datasoft @ datasoft-linux ~$ tr 'onetw' 'onezz' < mno.txt
Whaz is your name?
My name is prasanza.
datasoft @ datasoft-linux ~$
here-is-document是一种追加输入直到遇到特定序列(通常是EOF)的方法。 EOF 标记可以按字面输入,也可以使用 Ctrl-D 调用。
检查下面的代码
datasoft @ datasoft-linux ~$ cat < mno.txt
> What is your name?
> My name is prasanta.
> EOF
bash: mno.txt: cannot overwrite existing file
datasoft @ datasoft-linux ~$ cat mno.txt
What is your name?
My name is prasanta.
datasoft @ datasoft-linux ~$ cat < mno.txt
> What's your name?
> prasanta
> ^C
datasoft @ datasoft-linux ~$ cat mno.txt
What is your name?
My name is prasanta.
datasoft @ datasoft-linux ~$
版权所属:SO JSON在线解析
原文地址:https://www.sojson.com/blog/532.html
转载时必须以链接形式注明原始出处及本声明。
如果本文对你有帮助,那么请你赞助我,让我更有激情的写下去,帮助更多的人。