#!/bin/bash exec 3>&1 ls -l 2>&1 >&3 3>$- | grep bad 3>&- exec 3>&- 求详细解释上一段shll脚本的意思
发布网友
发布时间:2023-08-09 14:35
我来回答
共1个回答
热心网友
时间:2023-10-06 04:14
各种输出重定向啊,弄来弄去就是在做 ls -l 么。
你知道 ls -l 2>&1 >&3 是在做什么就行了。
还不清楚? 那再深入一点吧……
exec 3>&1 #在当前SHELL环境中将文件标识3与标准输出相关联(备份一个stdout)
ls -l 2>&1 >&3 3>&- | grep bad 3>&-
#管道右边: 为grep指令关闭文件标识3
#管道左边: ls -l 的stdout\stderr都重定向到之前标识3所备份的终端路径,所以其输出不经管道送入grep,而是直接输出到显示终端。
exec 3>&- #为SHELL后续代码关闭文件标识3追问恩确实在做ls -l ,刚接触,学习中
我不理解的地方是:“#管道右边: 为grep指令关闭文件标识3”,为什么要为grep关闭文件标识3
“#管道左边: ls -l 的stdout\stderr都重定向到之前标识3所备份的终端路径,所以其输出不经管道送入grep,而是直接输出到显示终端。” ls 最重输出结果到标准输出,那管道后面的grep貌似没什么用? 是吗
这个和子shell有关吧,请解释详细点
追答`exec 3>&1` 操作后为此SHELL内所有指令都开放文件标识3,而对于不需要使用标识3或对标识符3可能有其它指向的指令来说,这一点比较不安全,所以最好不用的时候显式关闭(3>&-),ls中用完就关了,grep中用不上也关了。(你可以试试不关有没有影响)
`ls -l 2>&1 >&3 3>&- | grep bad 3>&- ` 这之中使用了管道,grep尝试接管ls指令的输出通道,而这一个例子就是为了演示对于输出标识通道的重定向效果,它将ls指定默认的输出全部重定向为之前保留下来的终端输出通道,grep自然什么都没有拿到。
可以认为和子shell有点关系吧(但不是重点),因为没有exec的话,ls和grep指令中就没有文件标识3. 引入FD3也只是用作保存终端输出通道的一个过程量罢了。
不是很高深的东西,所以不用花费太多心思在这上头,会用就好。