我不太了解重定向逻辑。假设我在根目录 /root 中有这样的文件
ls -l
total 16692
-rw-r--r-- 1 root root 1249479 May 5 22:40 bootstrap-5.0.0-examples.zip
-rw-r--r-- 1 root root 786 May 9 12:49 in
drwxr-xr-x 9 root root 4096 May 5 16:43 nginx-1.19.0
-rw-r--r-- 1 root root 1043748 May 26 2020 nginx-1.19.0.tar.gz
drwxrwxr-x 18 root root 4096 May 5 16:52 openssl-1.1.1g
-rw-r--r-- 1 root root 9801502 Apr 21 2020 openssl-1.1.1g.tar.gz
-rw-r--r-- 1 root root 177 May 9 12:00 out_bash
drwxr-xr-x 9 1169 1169 12288 May 5 16:10 pcre-8.44
-rw-r--r-- 1 root root 2090750 Feb 12 2020 pcre-8.44.tar.gz
-rw-r--r-- 1 root root 2253029 May 7 11:02 v4.0.0.zip
drwxr-xr-x 14 501 staff 4096 May 5 16:18 zlib-1.2.11
-rw-r--r-- 1 root root 607698 Jan 15 2017 zlib-1.2.11.tar.gz
如果我满足
bash > out.txt
现在,如果您在同一目录中运行 ls,则 ls 将显示一个空目录!
为了让我可以再次看到我的文件和目录,我需要退出。在这种情况下,out.txt 文件将包含我所有的文件和目录的列表。
如果可能,如何实际应用?
不,程序的输出,它发送到它的标准输出,不会去你的终端,但会被写入一个
out.txt
.我将尝试清楚地证明。
这是当前bash进程(我们称其为“第一进程”)的标准文件描述符在实验之前的样子:
所有三个(-stdin , -stdout , -stderr)都是符号链接到
0
-由(我使用)终端模拟器创建的伪终端设备。1
2
/dev/pts/7
无论当前bash进程(及其后代)输出到stdout和stderr的任何内容都将进入伪终端设备,并且终端仿真器将在它绘制的窗口中显示给我们。
执行命令时
bash > out.txt
,我们启动一个新的bash进程(我们称之为“第二个进程”),它的标准输出将立即“附加”到文件out.txt
:这个进程(以及它生成的任何子进程)发送到的所有内容stdout将被写入此文件。让我们看看新进程的文件描述符发生了什么:
嗯。我什么都看不到。哦是的!我们将标准输出重定向到一个文件
out.txt
。如果您从附近的终端查看此文件,我们将看到ls进程的输出:请注意,正在运行的进程的标准句柄号
1
( stdout ) 是文件引用out.txt
。正是在这个文件中写入了ls进程的输出,并将其发送到他的标准输出(他从他的父级继承 - “第二个进程”)。如果我们现在执行命令
exit
,那么我们将结束“进程二”的工作,并返回到原来的状态——回到“进程一”。它将所有三个标准描述符“附加”到伪终端设备(注意进程号 - 11480 - 它与第一个列表中的相同):I/O 重定向几乎无处不在。使用任何 shell 脚本——你几乎肯定会在其中看到重定向。