【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脚本。

猜你喜欢

转载自blog.csdn.net/qFAFAF/article/details/130562857