如何使用带有bash的sudo tee在文件中写入$ something?

时间:2014-06-28 22:25:23

标签: linux bash

这是我的bash脚本,它编写一个自定义的nginx服务器块,也就是虚拟主机。

sudo tee /etc/nginx/sites-available/master <<EOF
server {
    listen      80;
    server_name localhost;
    root        /home/capt/WebRoot;

    location / {
        index       index.php;
        try_files   $uri $uri/ /index.php?q=$uri&$args;
    }

    error_page 404 /index.php;

    location ~ \.php$ {
        include                         fastcgi_params;
        fastcgi_index                   index.php;
        fastcgi_pass                    unix:/var/run/php5-fpm.sock;
        fastcgi_split_path_info         ^(.+\.php)(/.+)$;
        fastcgi_param PATH_INFO         $fastcgi_path_info;
        fastcgi_param PATH_TRANSLATED   $document_root$fastcgi_path_info;
        fastcgi_param SCRIPT_FILENAME   $document_root$fastcgi_script_name;
    }
}
EOF

一切都写得很好,除非这部分有一个$:

fastcgi_param PATH_INFO         ;
fastcgi_param PATH_TRANSLATED   ;
fastcgi_param SCRIPT_FILENAME   ;

如何解决此问题?

3 个答案:

答案 0 :(得分:3)

引用您的EOF

sudo tee /etc/nginx/sites-available/master <<'EOF'

BTW:任何$的内容都应该被破坏,而不仅仅是提到的行。

示例:

#! /bin/bash

cat <<'EOF'
a=$1
EOF

cat <<EOF
a=$1
EOF

执行:

bash test.sh 
a=$1
a=

答案 1 :(得分:1)

使用反斜杠$转义每个\字符。

所以这三行应该是这样的:

fastcgi_param PATH_INFO         \$fastcgi_path_info;
fastcgi_param PATH_TRANSLATED   \$document_root\$fastcgi_path_info;
fastcgi_param SCRIPT_FILENAME   \$document_root\$fastcgi_script_name;

我想文件中早先(至少)$uri也有问题,你可能错过了。因此,恰好逃避$的每一次出现。

答案 2 :(得分:1)

    fastcgi_param PATH_INFO         $fastcgi_path_info;
    fastcgi_param PATH_TRANSLATED   $document_root$fastcgi_path_info;
    fastcgi_param SCRIPT_FILENAME   $document_root$fastcgi_script_name;

由于上面以$开头的单词在bash中被视为变量,并且尚未初始化,因此它们为空。您应该完全期望得到的输出。按照提供的方式,使用$转义\$,您就可以了。