Abstract:
1) Linux Shell 命令的标准输入、标准输出、标准错误,及其重定位;
2)Linux Shell 操作自定义文件描述符;
文件描述符是与文件相关联的一些整数,他们保持与已打开文件的关联。众所周知的文件描述符是标准输入stdin、标准输出stdout、标准错误stderr,我们可以重定位这些文件描述符关联文件的内容到另外一个文件文件描述符。
1. Linux Shell 命令的标准输入、标准输出、标准错误
当我们在编写 shell 脚本时,我们会非常频繁地操作执行命令的标准输入stdin、标准输出stdout、标准错误stderr。过滤 shell 脚本或者执行命令的输出信息并且把它们重定位到特定的地方,成了我们分析脚本执行情况的必要工作。当我们执行脚本文件或者执行一个 shell 命令的时候,单从终端输出我们很难区分哪些是标准输出,哪些是标准错误。然而,我们把这些信息重定向特定的地方,以便于我们分析脚本文件及 shell 命令的执行情况。
文件描述符是与打开文件或者数据流
相关联的整数,
0、1、2 是系统保留的三个文件描述符,分别对应标准输入、标准输出、标准错误
。
Linux Shell 使用 " > " ">>" 进行对文件描述符进行重定位。
">" 与 ">>" 的作用是不一样的,前者使用本次输出内容替换原有文件的内容,后者则是把本次输出追加到原文件的后面。
在对文件描述符进行详细分析之前,先执行以下命令,为后面的实验操作准备一些必要的文件:
- echo -e "\e[42;31m --- Prepare resource file ---\e[0m";
- "This is example text 1." > temp.txt;
- "This is example text 2." >> temp.txt;
- .txt;
- "a1" > a1;
- "a2" > a2;
- "a3" > a3;
- ;
- -alF a*;
1.1 获取 Linux Shell 命令执行结果
Linux Shell 中每一条 shell 命令的执行都有返回值,用以返回命令的执行结果。
在命令执行结束后,通过引用 $? 获取最后一条命令执行的返回值,当返回值为零代表命令执行成功。
- echo -e "\e[42;31m --- Get command execution result! ---\e[0m";
- + ;
- -e "\e[1;32m --- 'ls + ' executed and return value is: $? \e[0m";
- -alF ./ ;
- -e "\e[1;32m --- 'ls -alF ./' executed and return value is: $? \e[0m";
2. 用户自定义文件描述符:
现在我们知道 0、1、2是 shell 保留的文件描述符;
另外,我们还可以定义自己的文件描述符,并对其进行读写;
用户自定义文件描述符使用 "exec" 命令进行创建;
用户自定义文件描述符的创建有三种形式:
1)只读方式的文件描述符;
2)截断模式创建写方式的文件描述符;
3)追加模式创建写方式的文件描述符;
2.1 以读方式创建文件描述符:
使用 " exec descriptor<file Name " 的模式创建只读模式的用户自定义文件描述符;
使用 "&descriptor" 的模式引用文件描述符;
只读方式的文件描述符只能读取一次,要再次读取,需要对文件描述符重新打开赋值;
- echo -e "\e[42;31m --- Create a file descriptor for reading file! --- \e[0m";
- <a1;
- -e "\e[1;32m'exec 3<a1' executed to create a file descriptor 3 for reading and return value is: $? ---\e[0m";
- -e "\e[1;32mContents of a1 as following output:\e[0m \e[1;33m";
- <&3;
- -e "\e[0m";
- -e "\e[1;32mContents of a1 with file descriptor 3 to read again as following output:\e[0m \e[1;33m";
- <&3;
- -e "\e[0m";