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

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

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

目录
相关文章
|
23天前
|
Shell Linux
【linux】Shell脚本中basename和dirname的详细用法教程
本文详细介绍了Linux Shell脚本中 `basename`和 `dirname`命令的用法,包括去除路径信息、去除后缀、批量处理文件名和路径等。同时,通过文件备份和日志文件分离的实践应用,展示了这两个命令在实际脚本中的应用场景。希望本文能帮助您更好地理解和应用 `basename`和 `dirname`命令,提高Shell脚本编写的效率和灵活性。
85 32
|
8天前
|
JavaScript Shell C#
多种脚本批量下载 Docker 镜像:Shell、PowerShell、Node.js 和 C#
本项目提供多种脚本(Shell、PowerShell、Node.js 和 C#)用于批量下载 Docker 镜像。配置文件 `docker-images.txt` 列出需要下载的镜像及其标签。各脚本首先检查 Docker 是否安装,接着读取配置文件并逐行处理,跳过空行和注释行,提取镜像名称和标签,调用 `docker pull` 命令下载镜像,并输出下载结果。使用时需创建配置文件并运行相应脚本。C# 版本需安装 .NET 8 runtime。
69 1
|
4月前
|
Shell Linux 测试技术
6种方法打造出色的Shell脚本
6种方法打造出色的Shell脚本
118 2
6种方法打造出色的Shell脚本
|
4月前
|
XML JSON 监控
Shell脚本要点和难点以及具体应用和优缺点介绍
Shell脚本在系统管理和自动化任务中扮演着重要角色。尽管存在调试困难、可读性差等问题,但其简洁高效、易于学习和强大的功能使其在许多场景中不可或缺。通过掌握Shell脚本的基本语法、常用命令和函数,并了解其优缺点,开发者可以编写出高效的脚本来完成各种任务,提高工作效率。希望本文能为您在Shell脚本编写和应用中提供有价值的参考和指导。
156 1
|
4月前
|
Ubuntu Shell 开发工具
ubuntu/debian shell 脚本自动配置 gitea git 仓库
这是一个自动配置 Gitea Git 仓库的 Shell 脚本,支持 Ubuntu 20+ 和 Debian 12+ 系统。脚本会创建必要的目录、下载并安装 Gitea,创建 Gitea 用户和服务,确保 Gitea 在系统启动时自动运行。用户可以选择从官方或小绿叶技术博客下载安装包。
149 2
|
10月前
|
Shell 索引
shell脚本入门到实战(四)- 数组
shell脚本入门到实战(四)- 数组
|
10月前
|
Shell
shell脚本入门到实战(三) - 变量
shell脚本入门到实战(三) - 变量
|
10月前
|
Shell Linux 人机交互
shell脚本入门到实战(二)--shell输入和格式化输出
shell脚本入门到实战(二)--shell输入和格式化输出
532 0
|
10月前
|
监控 关系型数据库 Shell
Shell脚本入门:从基础到实践,轻松掌握Shell编程
Shell脚本入门:从基础到实践,轻松掌握Shell编程
159 3
|
10月前
|
存储 Shell C语言
shell脚本 编程 变量 基本入门(详解)
shell脚本 编程 变量 基本入门(详解)
102 1