0

我遇到了需要在创建的目录中自动运行命令(确切地说是 drush 配置文件)的问题。我在将其作为参数运行的脚本本身中找不到太多建议,而我的上级指示我的逻辑似乎表明这是最好的方法。

这是 bash 脚本的作用:

  • 它为 Drupal 安装创建目录结构和一些 Apache2 文件
  • 它创建一个基本的 Drush 配置文件,然后由实用程序用于
  • 通过在包含此配置文件的目录中运行别名“standardprofile”来自动安装 Drupal 和模块

我用来从 Bash 运行脚本的实际命令(下面的完整脚本)是

cd /var/www/$DOMAINNAME-dev.$URL
eval "standardprofile"

上面的行不运行脚本(或超过第一行的任何内容,然后 bash 脚本恢复)是否有更好的方法来指示 bash 脚本从指定目录运行命令,然后在任何其他实用程序后恢复正在前台运行完成?

#!/bin/bash
# Creates the proper staging and development environment for a site

# Init
URL=example.com         #URL used in creating directories
OMIT_STAGING="n"        #Set to true if omitting staging
DOMAINNAME=""

###
# FUNCTIONS
###
function generate_empty_dirs {
    mkdir /var/www/$1-staging.$URL
    mkdir /var/www/$1-dev.$URL
    mkdir /var/www/$1-staging.$URL/logs
    mkdir /var/www/$1-staging.$URL/public_html
    mkdir /var/www/$1-dev.$URL/logs
    mkdir /var/www/$1-dev.$URL/public_html
}

function generate_drupal_staging_apacheconf {
    echo "<VirtualHost *:80>
            ServerAdmin webmaster@example.com
            ServerName $1-staging.$URL

            DocumentRoot /var/www/$1-staging.$URL/public_html
            <Directory /var/www/$1-staging.$URL/public_html>
                Options -MultiViews +ExecCGI
                Order allow,deny
                Allow from all

                RewriteEngine On
                RewriteBase /
                RewriteCond %{REQUEST_FILENAME} !-f
                RewriteCond %{REQUEST_FILENAME} !-d
                RewriteRule ^(.*)$ index.php?q=\$1 [L,QSA]

            </Directory>

            LogLevel warn
            ErrorLog /var/www/$1-staging.$URL/logs/error.log
            CustomLog /var/www/$1-staging.$URL/logs/access.log combined
            # enable PHP error logging
            php_flag  log_errors on
            php_value error_log  /var/www/$1-staging.$URL/logs/php_errors.log
            # Possible LogLevel values include: debug, info, notice, warn, error, crit,
            # alert, emerg.

    </VirtualHost>" > /etc/apache2/sites-available/$1-staging.$URL
}

function generate_drupal_dev_apacheconf {
    echo "<VirtualHost *:80>
            ServerAdmin webmaster@example.com
            ServerName $1-dev.$URL

            DocumentRoot /var/www/$1-dev.$URL/public_html
            <Directory /var/www/$1-dev.$URL/public_html>
                Options -MultiViews +ExecCGI
                Order allow,deny
                Allow from all

                RewriteEngine On
                RewriteBase /
                RewriteCond %{REQUEST_FILENAME} !-f
                RewriteCond %{REQUEST_FILENAME} !-d
                RewriteRule ^(.*)$ index.php?q=\$1 [L,QSA]

            </Directory>

            LogLevel warn
            ErrorLog /var/www/$1-dev.$URL/logs/error.log
            CustomLog /var/www/$1-dev.$URL/logs/access.log combined
            # enable PHP error logging
            php_flag  log_errors on
            php_value error_log  /var/www/$1-dev.$URL/logs/php_errors.log
            # Possible LogLevel values include: debug, info, notice, warn, error, crit,
            # alert, emerg.

    </VirtualHost>" > /etc/apache2/sites-available/$1-dev.$URL
}

function generate_wordpress_staging_apacheconf {
    echo "<VirtualHost *:80>
            ServerAdmin webmaster@example.com
            ServerName $1-staging.$URL

            DocumentRoot /var/www/$1-staging.$URL/public_html
            <Directory /var/www/$1-staging.$URL/public_html>
                Options -MultiViews +ExecCGI
                Order allow,deny
                Allow from all

                RewriteEngine On
                RewriteBase /
                RewriteRule ^index\.php$ - [L]
                RewriteCond %{REQUEST_FILENAME} !-f
                RewriteCond %{REQUEST_FILENAME} !-d
                RewriteRule . /index.php [L]

            </Directory>

            LogLevel warn
            ErrorLog /var/www/$1-staging.$URL/logs/error.log
            CustomLog /var/www/$1-staging.$URL/logs/access.log combined
            # enable PHP error logging
            php_flag  log_errors on
            php_value error_log  /var/www/$1-staging.$URL/logs/php_errors.log
            # Possible LogLevel values include: debug, info, notice, warn, error, crit,
            # alert, emerg.

    </VirtualHost>" > /etc/apache2/sites-available/$1-staging.$URL
}

function generate_wordpress_dev_apacheconf {
    echo "<VirtualHost *:80>
            ServerAdmin webmaster@example.com
            ServerName $1-dev.$URL

            DocumentRoot /var/www/$1-dev.$URL/public_html
            <Directory /var/www/$1-dev.$URL/public_html>
                Options -MultiViews +ExecCGI
                Order allow,deny
                Allow from all

                RewriteEngine On
                RewriteBase /
                RewriteRule ^index\.php$ - [L]
                RewriteCond %{REQUEST_FILENAME} !-f
                RewriteCond %{REQUEST_FILENAME} !-d
                RewriteRule . /index.php [L]

            </Directory>

            LogLevel warn
            ErrorLog /var/www/$1-dev.$URL/logs/error.log
            CustomLog /var/www/$1-dev.$URL/logs/access.log combined
            # enable PHP error logging
            php_flag  log_errors on
            php_value error_log  /var/www/$1-dev.$URL/logs/php_errors.log
            # Possible LogLevel values include: debug, info, notice, warn, error, crit,
            # alert, emerg.

    </VirtualHost>" > /etc/apache2/sites-available/$1-dev.$URL
}

function generate_drupal_drush_dev_profile {
    # Dev
    echo " <?php
    \$db_engine = 'mysql';
    \$db_name = '$1_db';
    \$db_user = '$1_user';
    \$db_pw = '1password';
    \$db_su = 'root';
    \$db_su_pw = '';
    \$site_name = '$1';
    \$account_name = 'admin';
    \$account_pw = 'example';
    \$account_mail = 'example@example.com';
    \$site_mail = \$account_mail;" > /var/www/$1-dev.$URL/installsettings.php
}

function generate_drupal_drush_staging_profile {
    #Staging
    echo " <?php
    \$db_engine = 'mysql';
    \$db_name = '$1_db';
    \$db_user = '$1_user';
    \$db_pw = '1password';
    \$db_su = 'root';
    \$db_su_pw = '';
    \$site_name = '$1';
    \$account_name = 'admin';
    \$account_pw = 'example';
    \$account_mail = 'example@example.com';
    \$site_mail = \$account_mail;" > /var/www/$1-staging.$URL/installsettings.php
}

function alter_group_owner {
    chown -R www-data /var/www/$1-staging.$URL
    chgrp -R www-data /var/www/$1-staging.$URL
    chown -R www-data /var/www/$1-dev.$URL
    chgrp -R www-data /var/www/$1-dev.$URL
    chown -R www-data /etc/apache2/sites-available/$1-staging.$URL
    chgrp -R www-data /etc/apache2/sites-available/$1-staging.$URL
    chown -R www-data /etc/apache2/sites-available/$1-dev.$URL
    chgrp -R www-data /etc/apache2/sites-available/$1-dev.$URL
}

###
# BEGIN MAIN LOGIC
###

# Checks to see if user is Root or is using Sudo, otherwise exit

if [ $(id -u) != 0 ]
then
    echo "You must have elevation to run this script."
    exit 1
fi

# Prompts for name of site
if [ -z "$1" ]
then
    read -p "Domain for the new site: " DOMAINNAME

    if [ ! -z $DOMAINNAME ]
    then
        echo "Generating the empty directories now..."
        generate_empty_dirs $DOMAINNAME
    else
        echo "You must provide a valid domain name"
        exit 1
    fi
else
    generate_empty_dirs $1
    DOMAINNAME=$1
fi

# Determine the kind of site being generated
read -p "Is this a (D)rupal or a (W)ordPress site? " SITETYPE
read -p "Do you need both the dev and staging sites? [Y/N] (case sensitive): " NEEDDIRS

    if [ -n "$SITETYPE" ]
    then
        if [ "$SITETYPE" == "D" ]
        then
            generate_drupal_dev_apacheconf $DOMAINNAME
            generate_drupal_drush_dev_profile $DOMAINNAME

            rm /var/www/$DOMAINNAME-dev.$URL/public_html
            rm /var/www/$DOMAINNAME-dev.$URL/logs

            cd /var/www/$DOMAINNAME-dev.$URL
            eval "standardprofile"

            if [ "$NEEDDIRS" == "Y" ] 
            then
                generate_drupal_staging_apacheconf $DOMAINNAME
                generate_drupal_drush_staging_profile $DOMAINNAME
                cd /var/www/$DOMAINNAME-staging.$URL
                eval "standardprofile"
                OMIT_STAGING="n"
            else
                OMIT_STAGING="y"
            fi
        elif [ "$SITETYPE" == "W" ]
        then
            generate_wordpress_dev_apacheconf $DOMAINNAME
            if [ "$NEEDDIRS" == "Y" ] 
            then
                generate_wordpress_staging_apacheconf $DOMAINNAME
                OMIT_STAGING="n"
            else
                OMIT_STAGING="y"
            fi
        else 
            echo "Invalid option provided"
            exit 1
        fi
    else
        echo "No option provided"
        exit 1 
    fi

alter_group_owner $DOMAINNAME

# Load the new confs into Apache

if [ "$OMIT_STAGING" == "y" ]
then
    a2ensite $DOMAINNAME-dev.$URL
    rm -rf /var/www/$DOMAINNAME-staging.$URL
else
    a2ensite $DOMAINNAME-dev.$URL
    a2ensite $DOMAINNAME-staging.$URL
fi

# Reload apache
service apache2 reload

# All done

echo "Sites created at domains:"
if [ "$OMIT_STAGING" == "y" ]
then
    echo $DOMAINNAME-dev.$URL
else
    echo $DOMAINNAME-dev.$URL
    echo $DOMAINNAME-staging.$URL
fi

exit
#End of script

还有 drush 脚本

#!/usr/bin/env drush
$a = drush_get_arguments();
$current_directory = getcwd();
$profiles = substr($a[1], 0, strlen($a[1])-15) . 'standard.make';
if(file_exists($current_directory . '/installsettings.php')) {
  require_once($current_directory . '/installsettings.php');
}
drush_print("Time to prepare our site install...");

if(!file_exists('logs')) {
  drush_op_system('mkdir logs');
}

if(!file_exists('public_html')) {
  $prev = drush_get_context('DRUSH_AFFIRMATIVE');
  drush_set_context('DRUSH_AFFIRMATIVE', TRUE);
  drush_invoke('make', array($profiles, 'public_html'));
  drush_op_system('cp public_html/sites/all/modules/services/servers/rest_server/lib/spyc/spyc.php public_html/sites/all/modules/services/servers/rest_server/lib/spyc.php');
  #drush_shell_exec('cd public_html');
  #shell_exec('cd public_html');
  chdir('public_html');
  drush_invoke_process("@self","site-install",null,array(
    'db-url' => $db_engine . "://" . $db_user . ":" . $db_pw . "@localhost/" . $db_name,
    'account-name' => $account_name,
    'account-pass' => $account_pw,
    'account-email' => $account_mail,
    'db-su' => $db_su,
    'db-su-pw' => $db_su_pw,
    'site-mail' => $site_mail,
    'site-name' => $site_name,
    'clean-url' => FALSE,
  ));
    drush_invoke_process("@self","pm-enable",
        array('ctools', 'views', 'views_ui', 'features', 'strongarm', 'fe_block',
            'entity', 'token', 'module_filter', 'pathauto', 'devel', 'simplehtmldom',
            'services', 'rest_server', 'entity_token', 'date', 'date_api', 'date_tools',
            'date_views', 'date_popup','rules', 'rules_admin', 'views_slideshow',
            'views_slideshow_cycle', 'strongarm', 'diff', 'auto_nodetitle', 'libraries',
            'realname', 'views_php'),
        array('root' => $current_directory . '/public_html'));
  drush_set_context('DRUSH_AFFIRMATIVE', $prev);
}
4

2 回答 2

3

是否有更好的方法来指示 bash 脚本从指定目录运行命令,然后在前台运行的任何其他实用程序完成后恢复?

当然:

( cd $dir && cmd )

将从指定目录运行 cmd。由于这两个命令在子shell 中运行,因此当子shell 完成时,脚本将在其当前目录中恢复。

于 2012-11-25T22:16:04.043 回答
1

这应该有效:

cd /var/www/$DOMAINNAME-dev.$URL
/usr/bin/env drush "standardprofile"
于 2012-11-25T22:14:43.470 回答