如何在fish shell与bash中串联yarn命令过滤install警告
问题根因
- fish 不支持 bash 独有的
>(...)进程替换语法,你之前给重定向路径加双引号的写法是无效的:shell 会把">(grep -v warning 1>&2)"识别为普通文件路径,直接把 stderr 输出写入这个名称特殊的本地文件,根本不会执行 grep 过滤逻辑。 - 这种错误的重定向写法会导致 yarn install 的退出状态传递异常,shell 判定前置命令执行失败,直接终止
&&后面的命令链路,所以 postinstall 不会触发。
跨 shell 兼容方案
不要依赖进程替换这类不同shell实现有差异的语法,使用通用的文件描述符重定向+管道写法,bash和fish都能正常识别执行,完整命令如下:
yarn install 3>&1 2>&1 >&3 | (grep -v "warning" >&2 || true) && yarn run postinstall --force
命令逻辑说明:
3>&1:提前将3号临时文件描述符指向当前终端的标准输出,用来中转yarn的正常输出内容2>&1 >&3:先把stderr(错误输出流)重定向到stdout进入管道,再把原本的stdout(正常输出流)重定向到3号描述符直接输出到终端,避免正常日志被grep处理- 管道后的
(grep -v "warning" >&2 || true):子shell内读取管道传过来的错误日志,过滤掉带warning的行后,把剩余错误内容重定向回stderr输出到终端;|| true用来忽略grep无匹配行时返回的非0退出码,避免过滤逻辑本身干扰命令链的状态判断 - 整条链路会正确读取yarn install的退出状态,只有yarn install执行成功(退出码为0)时,才会自动执行后面的
yarn run postinstall --force
注意事项
- 之前错误写法会在当前目录生成名为
>(grep -v warning 1>&2)的垃圾文件,直接删除即可 - 如果需要更精准的过滤规则(比如避免误杀其他输出中带warning字样的错误日志),可以调整grep匹配规则,例如用
grep -v "^warning "只过滤行首为warning的yarn警告
内容的提问来源于stack exchange,提问作者Sergino
相关产品推荐
相关产品推荐

