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的用法

posted on   叶子在行动  阅读(3207)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示