Bash循环批量安装Homebrew应用仅执行一次的问题排查
问题原因与解决方法
问题根源
brew install命令会默认读取标准输入(stdin),而你的while read APP循环正是从stdin读取$not_installed的内容。第一次迭代时,brew install启动后会把stdin中剩下的所有内容(也就是后续要安装的应用列表)全部消耗掉,导致read命令再也读不到下一行,循环直接终止。这就是为什么用echo替代时循环正常——echo不会读取stdin。
解决办法
有两种简单的修复方式:
方法1:重定向brew的标准输入到/dev/null
修改循环内的brew install命令,强制它不从stdin读取内容:
brew install "$formula" < /dev/null
这样brew install就不会干扰while read的输入流,循环就能正常遍历所有待安装应用。
方法2:改用for循环遍历应用列表
把while read循环改成for循环,直接遍历$not_installed的内容(你的apps.local中应用名称无空格,符合使用条件):
# 替换原来的while循环部分 for APP in $not_installed; do if [ "$APP" == "" ]; then continue; fi local formula=$(awk -v APP=$APP -F'\t' '$1==APP{print $2}' <(printf "%s\n" "$app_to_formula_map" ) ) brew install "$formula" done
这种方式下,循环的输入来源不是stdin,自然不会被brew install干扰。
验证修改
修改后重新运行脚本,就能看到brew install会依次处理所有未安装的应用,循环不会提前终止。
内容的提问来源于stack exchange,提问作者oligofren
相关产品推荐
相关产品推荐

