如何为Bash内置命令传递参数?解决xargs与wait的使用问题
解决bash内置命令通过xargs传参及wait接收PID的问题
一、xargs调用bash内置命令的方案
xargs默认仅识别系统PATH中的外部可执行文件,bash内置命令(如cd、wait)不属于外部文件,因此需要让xargs启动bash子进程,在子进程中执行内置命令,常用两种写法:
单参数替换写法:用
-I {}指定占位符,将管道传递的参数替换后执行命令# 示例:读取目录列表并逐个进入打印当前路径 cat dir_list.txt | xargs -I {} bash -c 'cd {} && pwd'批量参数处理写法:通过循环接收所有参数,适合一次传递多个值的场景
# 示例:等待多个后台进程结束 echo "1234 5678" | xargs bash -c 'for pid; do wait "$pid"; done' _注:这里的
_是占位符,用于填充bash -c命令的$0位置,后续传递的参数会作为$1、$2等被循环读取。
二、修复你的wait延迟执行脚本
你原脚本的问题在于:wait不读取标准输入,无法通过管道接收PID;且pgrep sleep可能匹配到其他无关的sleep进程,导致逻辑错误。推荐直接保存目标进程的PID,而非通过pgrep查询:
改进后的脚本:
sleep 60 & # $! 是bash特殊变量,代表最后一个后台进程的PID sleep_pid=$! # 等待指定PID的进程结束 wait "$sleep_pid" ls
如果一定要通过管道+wait实现(无实际必要,仅作演示),可以结合xargs调用bash执行内置的wait:
sleep 60 & echo $! | xargs bash -c 'wait "$1"' _ ls
内容的提问来源于stack exchange,提问作者zjnyly
相关产品推荐
相关产品推荐

