文件描述符是与文件输入输出相关联的整数,他们用来跟踪一打开的文件,最常见的文件描述符是stdin,stdout和stderr。
我们在编写脚本的时候会使用输入输出,当然也肯定会有错误。但是我们无法仅靠输出文本,是无法判断那些是正常文本,那些是错误文本。所以我们通过文件描述符来解决这个问题。
文件描述符:
0——stdin 标准输入
1——stdout 标准输出
2——stderr 标准错误
首先,我们看看如何输出:
echo "输出一些文本到" > target.txt
这种输出会把target.txt文件清空。
如果希望将输出追加到文件中,可以使用:
echo "再输出一些文本到" >> target.txt
可以使用cat来查看文件:
cat target.txt
当使用重定向操作符(> 或者 >> )时,内容不会出现在shell,而是直接输入到文件中,这时重定向操作符都是用了默认的文件描述符1,如果要使用其他描述符,要把描述符放在操作符之前。
举个例子:
ls 不存在的文件 > out.txt
这样会显示:
ls: 不存在的文件: No such file or directory
这时候标准错误并没有被输入到文件中,因为我们的默认描述符是1,所以也只有标准输出会输出到文件中。
如果我们这时候用:
ls 不存在的文件 2> out.txt
这时候stderr就不会显示在shell中,而是输出到了文件中。
我们可以将多个命令组合,通过管道pipe来连接每个过滤器filter,管道操作符是“|”。
例如:
$ ls | cat -n > out.txt
cat会接受ls命令输出的内容,加上-n参数,就会加上行号,然后通过stdout输出到文件。
我们也可以通过小括号()操作符来生成一个子进程subshell,再加上一个$,就可以把输出赋值给一个变量。
output=$(ls | cat -n)
命令在subshell中执行的时候,不会对当前的shell有任何影响。
不过我们使用subshell把输出赋值给一个变量的时候,会丢失空格和换行符,如果需要保留,可以把变量放到双引号中。
out="$(cat ouot.txt)"
echo $out