Bash与Fish:复用旧脚本时如何避免变量提前展开
解决Fish中使用bash -c复用脚本时变量被提前解析的问题
问题原因
你用双引号包裹bash -c的参数时,Fish会优先解析其中的$SHELL、$TERM等变量,把展开后的结果传给bash。此时bash收到的内容里已经是Fish的环境变量值,而非原变量名,所以即便你用了'EOF'也无法阻止变量被提前替换。
解决方案
不需要逐个给变量加反斜杠,只要让Fish不提前解析bash -c参数里的变量即可,推荐两种简洁方法:
方法1:用单引号包裹整个bash -c参数
直接把bash -c后面的命令用单引号括起来,Fish会将内部内容原封不动传给bash,由bash自行处理变量展开:
bash -c 'cat <<EOF | tee filename >/dev/null $SHELL $TERM EOF'
执行后,filename里会写入bash自身的$SHELL和$TERM值,而非Fish的。
方法2:保留单引号EOF的写法
如果需要在heredoc中使用'EOF'(强制bash不展开变量,仅作字面量输出),只需转义内部单引号即可:
bash -c 'cat <<'\''EOF'\'' | tee filename >/dev/null $SHELL $TERM EOF'
这种写法下,bash会将$SHELL和$TERM作为字面量写入文件,不会替换成自身环境变量。
内容的提问来源于stack exchange,提问作者jl4c
相关产品推荐
相关产品推荐

