①
关键步骤:将一个文件作为命令的输入,标准输出作为命令的输出:cat Documents/test.c;
将 echo 命令通过管道传过来的数据作为 cat 命令的输入,将标准输出作为命令的输出:echo 'hi' | cat;
将 echo 命令的输出从默认的标准输出重定向到一个普通文件:echo 'hello shiyanlou' > redirect cat redirect
②
关键步骤:先开启一个子 Shell:zsh;
使用exec替换当前进程的重定向,将标准输出重定向到一个文件:exec 1>somefile;
③
关键步骤:查看当前 Shell 进程中打开的文件描述符:cd /dev/fd/;ls -Al;
④作业:
关键步骤:这是想把 ls 命令的输出即当前目录的文件列表逐行读取出来,然后使用 rm -iv 在获得许可的情况下删除他们;现在的目录下存在名为:a、b、c、三个文件。那么运行这个程序后你会发现,虽然 rm 命令显示了询问是否删除的信息,但是 rm 完全没有关心你的回答,也就是整个程序没有删除一个文件,对计算机的指令它没有执行。
因为 rm -iv 期待用户从标准输入给出一个 y 或 n 的答案以确认是否删除,但标准输入被 < <(ls) 重定向了。于是 rm -iv 开始在 < <(ls) 里寻找答案。如果找不到 y 或者 n 就一直寻找下去,直到把 < <(ls) 的内容消耗完。这时在下一轮的循环中由于数据没有了, read 读不出数据,程序也就退出了。
解决方案:exec 3<&0
while read filename; do
rm -iv $filename <&3
done < <(ls)
学习时间 102分钟
操作时间 24分钟
按键次数 724次
实验次数 6次
报告字数 1075字
是否完成 完成