这段代码是/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脚本。