使用tee命令向文件追加内容时如何避免内部命令被自动执行
问题原因
你使用的是默认的无引号Here Document语法<< EOF,此时Shell会自动解析块内的命令替换$()、变量引用$xxx、反引号命令等内容,直接执行后把结果替换到对应位置,所以才会出现$(/usr/bin/id -u)被替换成当前用户UID的情况。
解决方法
方案1(推荐,整段原样保存)
给结束标识符EOF包裹单引号,就能禁用整个Here Document块内的所有特殊解析,完全按输入的原文写入文件,正确写法如下:
tee -a test.sh << 'EOF' if [[ $(/usr/bin/id -u) -ne 0 ]]; then echo You are not running as the root user. exit 1; fi; EOF
单引号包裹在EOF两侧即可,和<<之间可以留空格也可以不留,效果一致。
方案2(局部禁用替换)
如果你只需要部分内容不被解析,其余内容还是要做变量/命令替换的话,可以给需要原样保留的$符号前加转义符\,写法如下:
tee -a test.sh << EOF # 这里的$HOME会被解析替换成当前用户家目录 echo 当前用户家目录是$HOME # 这里加了转义符的\$不会被解析,原样保留 if [[ \$(/usr/bin/id -u) -ne 0 ]]; then echo You are not running as the root user. exit 1; fi; EOF
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

