标准输入输出及管道

发布时间 2023-05-29 11:11:38作者: leethon

标准输入输出及管道

执行一个 Shell 命令行时通常会自动打开三个标准文件,即标准输入文件(stdin),通常对应终端的键盘;标准输出文件(stdout)和标准错误输出文件(stderr),这两个文件都对应终端的屏幕。进程将从标准输入文件中得到输入数据,将正常输出数据输出到标准输出文件,而将错误信息送到标准错误文件中。

标准输入与输出

  • stdin:标准输入,通常对应终端键盘
  • stdout:标准输出,通常对应终端屏幕
  • stderr:标准错误输出,也对应终端屏幕

在一次shell的输入中,我们可能得到正确的或者错误的结果,而在不做任何处理的情况下,stdout和stderr都会输出到终端屏幕上

如:

~ ls
test.txt		# 正确的由命令执行后进行的标准输出
~ aaa
zsh: command not found: aaa	# 错误的由终端进行的标准输出

标准输入及其重定向

进行完全的标准输入:cat命令一般后面跟文件名,然后输出其中的内容,但是如果不跟文件,则会直接进入索要输入的状态,并且输入一句就输出一句。

~ cat
aaa
aaa
bbb
bbb

实际上可以看做,本身命令就需要键盘的标准输入,来根据输入做一些输出的操作。

但是标准输入可以由<<<来重定向:

  • <:重定向至文件输入,如wc < /etc/passwd # wc表示统计输入的行数、字符等

  • <<:here文档,当场编辑文档,用指定分隔符表示文档的结束。(但是不咋用,略过,用到再查)

标准输出及其重定向

上文提到,无论是stdout还是stderr都是默认输出到终端的,而这些内容可以被重定向到文件中。

ls ~/hhhh > hhhh_dir.txt							# 如果输入到的文件中有内容,则会被覆盖重写
ls ~/xxxx 2> xxxx_dir.txt							# 2>是指将错误输出stderr放到制定文件中
echo mysql==5.7 >> requirements.txt		# >>将内容追加到文件的末尾,而不会覆写
&>  # 将正确和错误的输出同时放到一个文件中

管道

管道符号|,可以用来讲一个命令的输出直接输入到另一个命令中。

如:ls /usr/bin|grep python,即ls命令原本该输出的所有bin目录下的文件和目录名,但是通过管道,这些输入呗grep命令筛选了一遍,只展示内部含有python的。

那么有这么一个需求:

统计一个文件目录下的文件个数,则就可以利用管道,将两条命令结合起来:

ls /usr/bin|wc -w

命令替换

cmd1 `cmd2`
# cmd2的输出将作为cmd1的参数,进行执行