Linux 管道与参数传递(xargs&exec)
深入学习链接:Linux 的进程间通信:管道 - 知乎 (zhihu.com)
Linux管道符|命令使用详解_linux中|的用法-CSDN博客
一、什么是管道?
管道(pipe),在任何一个shell中,都可以使用“|”连接两个命令,shell会将前后两个进程的输入输出用一个管道相连,以便达到进程间通信的目的。管道本质上就是一个文件,前面的进程以写方式打开文件,后面的进程以读方式打开。这样前面写完后面读,于是就实现了通信。Linux系统直接把管道实现成了一种文件系统,借助VFS给应用程序提供操作接口。
虽然实现形态上是文件,但是管道本身并不占用磁盘或者其他外部存储的空间。在Linux的实现上,它占用的是内存空间。所以,Linux上的管道就是一个操作方式为文件的内存缓冲区。
二、管道的作用
“|”是Linux管道命令操作符,简称管道符。使用此管道符“|”可以将两个命令分隔开,“|”左边命令的输出就会作为“|”右边命令的输入,此命令可连续使用,第一个命令的输出会作为第二个命令的输入,第二个命令的输出又会作为第三个命令的输入,依此类推。
语法:command1 | command2 |command3 |...
原理:
三、管道的使用
1.管道符的基础使用
1)单个管道符
[root@master ~]# rpm -qa | grep 'httpd' httpd-tools-2.4.6-99.el7.centos.1.x86_64 httpd-2.4.6-99.el7.centos.1.x86_64
2)复合管道符
[root@master etc]# netstat -lntp | awk 'NR==3 {print $4}' | awk -F':' '{print $2}'
53
2.管道符配合参数传递
1)xargs
对(ls cp rm)管道不能执行。所以通过xargs。
①xargs命令
xargs 命令给其他命令传递参数的一个过滤器,也是组合多个命令的一个工具。它擅长将标准输入数据转换成命令行参数,xargs 能够处理管道或者 stdin 并将其转换成特定命令的命令参数。xargs 也可以将单行或多行文本输入转换为其他格式,例如多行变单行,单行变多行。xargs 的默认命令是 echo,空格是默认定界符。这意味着通过管道传递给 xargs 的输入将会包含换行和空白,不过通过 xargs 的处理,换行和空白将被空格取代。xargs 是构建单行命令的重要组件之一。
②xargs的语法:
cat a.txt | xargs -i cp {} /目录
{}:前面传过来的内容一行一行赋值
-i :为了让大括号生效
解释:前面传过来的东西交给大括号
ls -l 后面可以不加大括号,直接执行。
③xargs的选项
-n 选项 多行输出
-d 选项 自定义一个定界符
-t 选项 打印出 xargs 执行的命令
-p 选项 会在执行每一个命令时弹出确认
-I 选项 指定一个替换字符串{}
④xargs的使用
[root@master tmp]# touch /tmp/file{1..5} [root@master tmp]# cat files.txt /tmp/file1 /tmp/file2 /tmp/file3 /tmp/file4 /tmp/file5 [root@master tmp]# cat files.txt | ls -l #然后观察结果 [root@master tmp]# cat files.txt | rm -rvf #然后观察结果 [root@master tmp]# echo $? 0
可以看到直接使用管道符,命令没有按照我们的预期执行,但$?返回值依旧为0,下面使用xargs命令传参:
[root@master tmp]# cat files.txt |xargs ls -l -rw-r--r-- 1 root root 0 Nov 11 14:49 /tmp/file1 -rw-r--r-- 1 root root 0 Nov 11 14:49 /tmp/file2 -rw-r--r-- 1 root root 0 Nov 11 14:49 /tmp/file3 -rw-r--r-- 1 root root 0 Nov 11 14:49 /tmp/file4 -rw-r--r-- 1 root root 0 Nov 11 14:49 /tmp/file5 [root@master tmp]# cat files.txt |xargs rm -rvf removed ‘/tmp/file1’ removed ‘/tmp/file2’ removed ‘/tmp/file3’ removed ‘/tmp/file4’ removed ‘/tmp/file5’
成功执行!
[root@master tmp]# cat files.txt | xargs -i cp -rvf {} /tmp/ ‘/opt/file1’ -> ‘/tmp/file1’ ‘/opt/file2’ -> ‘/tmp/file2’ ‘/opt/file3’ -> ‘/opt/file3’ ‘/opt/file4’ -> ‘/tmp/file4’ ‘/opt/file5’ -> ‘/tmp/file5’
2)exec
①exec命令
exec命令 用于调用并执行指令的命令。exec命令通常用在shell脚本程序中,可以调用其他的命令。如果在当前终端中使用命令,则当指定的命令执行完毕后会立即退出终端。
②exec的语法
command1 -exec command2 {} /目录 \;
exec 对之前查找出来的文件做进一步操作
{} 为前面查找到的内容
\; 格式
③exec的选项
-c:在空环境中执行指定的命令。
④exec的使用
exec命令对之前查找出来的文件做进一步操作----- 查找带ifcfg开头的文件复制到tmp下
[root@master tmp]# rm -rf file* [root@master tmp]# ls ifcfg-ens33 ifcfg-lo
3)-exec和xargs的区别
-exec:参数是一个一个传递的,传递一个参数执行一次命令。
xargs:将前一个命令的标准输出传递给下一个命令,作为它的参数转换成下一个命令的参数列表。
1、exec 每处理一个文件或者目录,它都需要启动一次命令,效率不好;
2、exec 格式麻烦,必须用 {} 做文件的代位符,必须用 \来转义; 作为命令的结束符,书写不便。
3、xargs不能操作文件名有空格的文件;
综上,如果要使用的命令支持一次处理多个文件,并且也知道这些文件里没有带空格的文件,那么使用 xargs比较方便; 否则,就要用 exec了。
参考链接:https://blog.csdn.net/Sakura_QKS/article/details/134346349
在 Shell 脚本中使用 `exec` 命令的方法和用途
在 Shell 脚本中,exec 是一个非常有用的命令,用于执行命令或替换当前进程。它允许您在脚本中启动新的进程,并将控制权完全转移到新进程。本文将详细介绍在 Shell 脚本中使用 exec 命令的方法和用途。
什么是 Exec 命令?
exec 是一个用于替换进程或执行命令的 Shell 内建命令。它可以将当前脚本的执行环境替换为新的进程,并在执行新进程后不返回到原始脚本。简单来说,exec 命令用于取代当前进程并执行新的命令。
使用 exec 命令可以实现以下功能:
执行一个新的命令并替换当前进程。
将当前脚本的执行环境传递给新的进程。
在脚本中启动后台进程并将控制权转移到后台进程。
使用 Exec 命令
以下是在 Shell 脚本中使用 exec 命令的一些常见用法和示例:
1. 执行新的命令
您可以使用 exec 命令在脚本中执行新的命令并替换当前进程。以下是一个示例:
#!/bin/bash
# 执行新的命令并替换当前进程
exec ls -l
在上述示例中,脚本将执行 ls -l 命令,并且原始脚本的执行环境将被替换为新的进程。执行 exec 命令后,脚本不会继续执行剩余的命令。
2. 传递执行环境给新进程
使用 exec 命令时,您可以将当前脚本的执行环境传递给新的进程。这对于需要在子进程中访问脚本变量和函数的情况非常有用。以下是一个示例:
#!/bin/bash # 定义一个函数 function print_message { echo "Hello, $1!" } # 传递执行环境给新进程 exec bash -c 'print_message "John"'
在上述示例中,脚本定义了一个名为 print_message 的函数,并使用 exec 命令将执行环境传递给一个新的 Bash 子进程。新的子进程执行了一个命令,调用了脚本中定义的函数,并传递了一个参数。
3. 后台进程
exec 命令还可以用于在脚本中启动后台进程,并将控制权转移到后台进程。以下是一个示例:
#!/bin/bash # 启动后台进程并转移控制权 exec bash -c 'sleep 5s &'
在上述示例中,脚本使用 exec 命令启动一个后台进程,即 sleep 5s 命令,并将控制权完全转移到后台进程。这意味着脚本不会等待后台进程完成,而是立即退出。
注意事项
在使用 exec 命令时,需要注意以下几点:
exec 命令将取代当前进程并执行新的命令,因此在 exec 命令之后的脚本代码将不再执行。
如果 exec 命令执行失败,脚本将继续执行后续的命令。
使用 exec 命令时,要确保正确处理输入和输出,以避免意外的结果或数据丢失。
当使用 exec 命令替换当前进程时,新进程将继承原始脚本的文件描述符和环境变量。这可以让新进程访问和操作与原始脚本相关的资源。
如果在脚本中使用 exec 命令启动后台进程,要确保在适当的时候结束或清理后台进程,以避免资源泄露或不必要的进程运行。
总结
exec 命令是一个在 Shell 脚本中非常有用的工具,可以用于执行新的命令、传递执行环境给新进程以及启动后台进程。使用 exec 命令可以灵活控制脚本的执行环境和进程替换。
在编写 Shell 脚本时,了解和掌握 exec 命令的用法可以帮助您更好地管理和控制脚本的执行流程。请根据您的实际需求和场景合理使用 exec 命令,并注意遵循最佳实践和安全准则。
参考链接:https://blog.csdn.net/weixin_43025343/article/details/130951691
其他参考链接:https://article.itxueyuan.com/L3Mj6L exec命令详解
https://www.cnblogs.com/Alfred-HOO/articles/16341414.html linux中exec的用法
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?