如何仅当内层进程执行成功时将其输出作为参数传入其他进程
实现方案
该需求完全可以实现,核心逻辑是先捕获内层进程输出,校验退出码后再决定是否执行外层进程,不要直接把命令替换嵌套在外层命令参数里。
通用兼容写法(兼容所有POSIX标准Shell,包括bash、zsh、dash等)
先把内层进程的输出存入变量,再通过特殊变量$?拿到内层进程的退出码,判断为0(执行成功)后再调用外层进程:
output=$(./other_process) if [ $? -eq 0 ]; then ./process --input "$output" fi
简洁单行写法
如果不需要额外的错误分支处理,可以直接用&&连接逻辑,只有前一条命令执行成功(退出码为0)时才会执行后一条命令:
output=$(./other_process) && ./process --input "$output"
特殊场景适配
如果需要把内层进程的错误输出(stderr)也一起捕获作为参数,或者不想让内层进程的错误信息直接打印到终端,可以在捕获输出时把stderr重定向到stdout:
output=$(./other_process 2>&1) && ./process --input "$output"
注意事项:引用存储输出的变量时一定要加双引号,否则如果输出内容包含空格、换行、shell通配符,会被自动做词拆分、通配符展开,导致传参不符合预期。
不要尝试写
./process --input $(./other_process)类的嵌套变体,这类写法无论内层进程是否执行成功,外层进程都会被启动,只是失败时传入的参数可能为空,无法满足拦截执行的需求。
内容的提问来源于stack exchange,提问作者jhourback
相关产品推荐
相关产品推荐

