MacOS Shell脚本中!!命令报错求助:需实时输出并判断结果
解决Shell脚本中
!!报错且保留实时输出的问题 这个问题我之前也碰到过,核心原因是!!这个历史扩展只有在交互式Shell里才生效——就是你在终端逐行敲命令的那种模式,而脚本运行属于非交互式环境,Shell默认不会解析这个语法,所以才会抛出‘!! command not found’的错误。
而你改用管道的写法看不到实时输出,是因为./ongoingShellScript.sh | grep "errors: 0"把ongoingShellScript.sh的标准输出直接重定向给了grep,终端自然接收不到输出内容。
下面给你两个实用的解决方案,既能保留实时输出,又能正确判断执行结果:
方案一:用tee分流输出到终端和临时文件
这个方法最直观,通过tee命令把脚本的输出同时发送到终端(让你实时看到)和一个临时文件,之后再检查临时文件里的内容:
#!/bin/bash # 创建临时文件,避免污染系统环境 temp_file=$(mktemp) # 确保脚本退出时自动删除临时文件,避免残留 trap 'rm -f "$temp_file"' EXIT # 执行目标脚本,用tee分流输出 ./ongoingShellScript.sh | tee "$temp_file" # 检查临时文件中是否包含"errors: 0" if grep -q "errors: 0" "$temp_file"; then echo "Success" exit 0 else echo "Failure" exit 1 fi
代码说明:
mktemp:自动生成一个唯一的临时文件路径,避免文件名冲突trap 'rm -f "$temp_file"' EXIT:不管脚本是正常结束还是异常退出,都会自动删除临时文件tee "$temp_file":把ongoingShellScript.sh的输出同时打印到终端和临时文件grep -q:静默模式,只检查是否匹配,不输出匹配内容,避免干扰终端输出
方案二:直接捕获输出并实时打印(进阶写法)
如果你不想用临时文件,可以把脚本的输出捕获到变量里,同时实时打印出来:
#!/bin/bash # 捕获输出的同时实时打印 output=$(./ongoingShellScript.sh | tee /dev/tty) # 检查捕获到的输出内容 if echo "$output" | grep -q "errors: 0"; then echo "Success" exit 0 else echo "Failure" exit 1 fi
代码说明:
/dev/tty是当前终端的设备文件,tee /dev/tty会把输出直接打印到终端output=$(...)会把ongoingShellScript.sh的输出捕获到变量中,后续直接用这个变量做检查
这两个方案都能完美解决你的问题:既保留了实时输出,又能正确判断脚本执行是否符合预期。
内容的提问来源于stack exchange,提问作者Gaurav
相关产品推荐
相关产品推荐

