【问题标题】:print multiple lines in shell - improving readability in provisioning a Vagrantfile在 shell 中打印多行 - 提高配置 Vagrantfile 的可读性
【发布时间】:2015-04-27 19:39:51
【问题描述】:

我使用 printf 来设置我的 Nginx 设置,它工作正常,但是阅读和更改很尴尬;有没有更好的方法来提高可读性?

config.vm.provision "shell", inline: <<-SHELL

    sudo rm /etc/nginx/sites-enabled/default

    sudo printf '%s\n' 'server {' 'root /home/vagrant/web;' 'index index.php index.html index.htm;' 'location / {' 'try_files $uri $uri/ /index.php?$args ;' '}' 'location ~ \.php$ {' 'fastcgi_split_path_info ^(.+\.php)(/.+)$;' 'fastcgi_pass unix:/var/run/php5-fpm.sock;' 'fastcgi_index index.php;' 'include fastcgi_params;' '}' '}' >> /etc/nginx/sites-enabled/default

    sudo service nginx start

SHELL

【问题讨论】:

  • 假设这在 vagrantfile 中是合法的,您可以只使用单个单引号字符串作为 printf 的参数并在字符串中使用文字换行符。
  • sudo printf 仅提升printf 命令的权限,该命令仅在打开输出文件之后运行,这意味着它不会为您提供任何提升的权限打开输出文件,所以这里给出的sudo 对你的 Vagrantfile 的工作方式没有任何好处。

标签: shell nginx vagrantfile code-readability


【解决方案1】:

假设您的客户机上有 Bash,您可以尝试使用嵌套 bash here documents。无法保证可以与 Vagrantfile 一起使用,但无论如何都值得一试。

config.vm.provision "shell", inline: <<-SHELL

    sudo /bin/bash << 'SCRIPT'
        rm /etc/nginx/sites-enabled/default;

        cat << 'EOF' >> /etc/nginx/sites-enabled/default
            %s\n

            server {
                root /home/vagrant/web;
                index index.php index.html index.htm;

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

                location ~ \.php$ {
                    fastcgi_split_path_info ^(.+\.php)(/.+)$;
                    fastcgi_pass unix:/var/run/php5-fpm.sock;
                    fastcgi_index index.php;
                    include fastcgi_params;
                }
            }
EOF
        service nginx start
SCRIPT
SHELL

请注意,EOF、SCRIPT 和 SHELL 必须放在行首。这些词的前面不能有任何制表符或空格。

【讨论】:

  • 这里唯一明显的问题是你没有引用你的heredoc sigils,所以它们的参数扩展是由外壳评估的。 &lt;&lt;'EOF'&lt;&lt;\EOF 会按字面意思发出内容,而不是尝试根据 shell 中的 shell 变量来评估 $uri,以评估heredoc。
  • ...相比之下,&lt;&lt;-SHELL 是 Vagrantfile 外部的 Ruby 语法,而不是 shell,因此无需在此处引用 sigil。
  • @CharlesDuffy 是的,你是对的。感谢您注意到这个错误。我已经更正了我的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-08
  • 2018-10-27
  • 1970-01-01
相关资源
最近更新 更多