2012-05-24 4 views
1

J'essaie d'exécuter le script de démarrage Apache, /etc/init.d/httpd. définitions des variables d'environnement comme celui-ci donnent une erreur:Quel est le problème avec cette syntaxe de script shell?

CONF_FILE=$(APACHE_HOME)/conf/httpd.conf 

Il dit "/etc/init.d/httpd: line 15: APACHE_HOME: command not found"

Alors, je l'ai remplacé les parenthèses avec des accolades, et le script a travaillé swimmingly. Ce qui donne? Je ne fais que poser cette question parce que je veux comprendre pourquoi c'est faux, pas comment y remédier. Le shebang est là, et il n'est pas modifié depuis le script shell original, alors pourquoi est-ce qu'il interprète mal les choses?

+0

Pourquoi des crochets? Laissez-les – DonCallisto

+1

'$ (foo)' essaie d'exécuter 'foo' comme une commande, et substitue la sortie de cette commande. APACHE_HOME n'est pas une commande. –

+1

'$()' est une interpolation de commande, '$ {}' est une substitution de variable –

Répondre

2

Dans les systèmes unix:

$SOMETHING /* variable */ 
$(SOMETHINGELSE) /* command */ 
${FOO} */ variable substitution */ 
+0

Oui, je vois ça maintenant, mais pourquoi est-ce que httpd est faux? Il a été écrit par Apache! –

+0

avec "()" ????? – DonCallisto

1

$(something) indique au shell d'exécuter la commande something et de remplacer la sortie de la commande.

Vous voulez substituer une sortie de la variable , vous avez juste besoin d'un $ devant la variable, comme ceci: CONF_FILE=$APACHE_HOME/conf/httpd.conf

Sinon, vous pouvez utiliser CONF_FILE=${APACHE_HOME}/conf/httpd.conf (notez les accolades au lieu de parenthèse), mais ce n'est pas vraiment nécessaire pour votre situation.


Ceci est utile lorsque vous souhaitez affecter une sortie de commande à une variable. Par exemple:

MY_VAR="$(egrep 'someline' somefile.txt)" 
+0

Dans une affectation comme celle-ci, les guillemets ne sont pas nécessaires autour d'une variable. – Kevin

+0

@Kevin Bon appel, va modifier avec les modifications à venir. –

1

$(...) exécute son contenu dans un sous-shell, il ne reçoit pas la valeur d'une variable. Vous pouvez utiliser simplement $APACHE_HOME ou ${APACHE_HOME}, ce qui vous semble être le cas.

Questions connexes