【Shell篇】循环查找某个目录的脚本文件并打印运行

这段代码是/build/envsetup.sh文件最后一段代码,搜索了源代码中所有的vendorsetup.sh脚本。

for f in `test -d device && find -L device -maxdepth 4 -name 'vendorsetup.sh' 2> /dev/null | sort` \
         `test -d vendor && find -L vendor -maxdepth 4 -name 'vendorsetup.sh' 2> /dev/null | sort` \
         `test -d product && find -L product -maxdepth 4 -name 'vendorsetup.sh' 2> /dev/null | sort`
do
    echo "including $f"
    . $f
done

这句代码是一个 shell 命令,大致意思是:如果当前目录中存在名为 device 的目录,则在该目录下递归查找深度不超过 4 级的所有文件中,名字为 vendorsetup.sh 的文件,并将find结果按照字母顺序排序。

具体语法解释如下:

  • test -d device:判断当前目录下是否存在一个名为 device 的目录。-d 表示测试对象是一个目录。
  • &&:如果上一条命令执行成功(即返回值为 0),则执行下面的命令;否则停止执行后续命令。
  • find -L device -maxdepth 4 -name 'vendorsetup.sh':在 device 目录下查找深度不超过 4 级的,名字为 vendorsetup.sh 的文件。各参数含义如下:
    • -L:表示遇到符号链接时,跟随它指向的文件/目录进行操作。
    • device:要查找的目录。
    • -maxdepth 4:查找的最大深度为 4 级子目录。
    • -name 'vendorsetup.sh':查找文件名为 vendorsetup.sh 的文件。
  • 2> /dev/null:将标准错误输出重定向到 /dev/null 中,如果 find 命令发生错误,它的错误信息会被丢弃掉,而不会影响整个管道的执行。
  • | sort:将查找到的结果按照字母顺序排序。| 表示将前面命令的输出作为后面命令的输入。

| 是将前面find命令的输出还是错误输出以此来作为后面命令的输入?

| 是一个管道符号,它表示将前面命令的标准输出(而不是错误输出)作为后面命令的标准输入。

所以!

在这个代码中,find 命令的标准输出(即查找到的文件路径)将被传递给 sort 命令作为标准输入,并进行排序操作。


那如果我想要把错误输出也给到管道怎么办呢?

在 shell 中,| 表示将前一个命令的标准输出 (stdout)作为后一个命令的标准输入(stdin),并将它们通过管道链接起来。

因此,在这段代码中,find 命令的标准输出(即文件路径)会被传递给下一个命令 sort 的标准输入。管道符号不会将错误输出(stderr)传递给下一个命令。

如果想要将错误输出也一起重定向到管道中,可以使用以下语法:

command1 2>&1 | command2

其中 2>&1 表示将标准错误输出(2)重定向到标准输出(1)中,然后再通过管道传递给下一个命令 command2


在循环中,依次打印路径名称,并source运行所有找到的vendorsetup.sh脚本。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

七qi_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值