为何覆写IFS读取多变量失效:ps输出与进程数全分配到首个变量
问题原因与解决方案
核心问题原因
- Shell 函数的
return只能用来返回 0~255 范围的退出状态码,不能用于返回业务数值(比如进程数),一旦进程数超过255会直接溢出,逻辑完全不可靠。 - 你原写法中
status 2>&1; echo "#$?"生成的字符串包含ps输出的多行行尾换行,加上here string自动追加的换行符,导致read的分隔识别逻辑异常,分隔符#没有被正确切割,所有内容都被分配给了第一个变量ret。 tee /dev/stderr配合重定向的写法兼容性差,部分环境下会出现输出顺序混乱的问题。
修复后的脚本
直接把ps结果和进程数按分隔符输出到标准流,不需要依赖返回值和stderr重定向:
#!/bin/bash function status() { # 先保存ps匹配结果 ps_result=$(ps -ef | grep 'noah.*super' | grep -v grep) # 计算匹配到的进程数量 proc_num=$(echo "$ps_result" | wc -l) # 用#拼接两个结果输出(确保ps结果中无#字符即可,你这个场景满足) echo "${ps_result}#${proc_num}" } # 用字符串切割直接提取,兼容性最好,不受换行影响 content=$(status) ret=${content%#*} proc_num=${content#*#} echo -e "proc_num: $proc_num\n" echo -e "ret: $ret"
内容的提问来源于stack exchange,提问作者Cans404
相关产品推荐
相关产品推荐

