2010-05-28 7 views
3

Lors de l'exécution d'un script bash sur ubuntu 9.10, j'obtiens un comportement différent de l'option "-e" de bash echo selon que je cours ou non en tant que root.echo -e agit différemment lorsqu'il est exécuté dans un script par root sur ubuntu

Tenir compte de ce script:

$ cat echo-test 
if [ "`whoami`" = "root" ]; then 
    echo "Running as root" 
fi 
echo Testing /bin/echo -e 
/bin/echo -e "foo\nbar" 
echo Testing bash echo -e 
echo -e "foo\nbar" 

Lorsqu'il est exécuté en tant qu'utilisateur non root, je vois cette sortie:

$ ./echo-test 
Testing /bin/echo -e 
foo 
bar 
Testing bash echo -e 
foo 
bar 

Exécuté en tant que root, je vois cette sortie:

$ sudo ./echo-test 
Running as root 
Testing /bin/echo -e 
foo 
bar 
Testing bash echo -e 
-e foo 
bar 

Notez que "-e" est renvoyé dans le dernier cas ("-e foo" au lieu de "foo" sur l'avant-dernière ligne). Lors de l'exécution d'un script en tant que root, la commande echo s'exécute comme si "-e" était donné et, si -e est donné, l'option elle-même est renvoyée en écho.

Je peux comprendre de subtiles différences de comportement entre/bin/echo et bash echo, mais je m'attendrais à ce que bash echo se comporte de la même manière quel que soit l'utilisateur qui l'appelle.

Quelqu'un sait pourquoi c'est le cas? Est-ce un bug dans bash echo?

FYI - Je suis en bash GNU, la version 4.0.33 (1) -release (x86_64-pc-linux-gnu)

Répondre

4

Etes-vous sûr que votre utilisateur et de la racine à la fois utiliser bash leur coquille? essayez de mettre une ligne "shebang" (#!/Bin/bash) dans votre script comme première ligne, et exécutez-la à nouveau

+0

#!/Bin/bash au sommet corrige ce problème. Donc root doit utiliser un shell différent avec un écho différent. Ça a du sens. Merci beaucoup! – user353172

1

Il peut être intéressant de voir la valeur de la variable d'environnement POSIXLY_CORRECT et de déterminer si l'option shell xpg_echo est activé dans les deux situations.

if test -n "${POSIXLY_CORRECT+yes}"; then 
    pc="set '$POSIXLY_CORRECT'" 
else 
    pc=unset 
fi 
echo POSIXLY_CORRECT: "$pc" 
shopt -q xpg_echo && xe=set || xe=unset 
echo xpg_echo: $xe 

Voici le code de test, je l'habitude d'examiner les diverses combinaisons:

{ n=1 
for p in '' p; do 
    for x in '' x; do 
     for e in '' e; do 
      printf "\nmode: ${p:-_}${x:-_}${e:-_}\n" 
      test -n "$x" && xx=-s || xx=-u 
      bash ${p:+--posix} -c "    shopt $xx xpg_echo 
       test -n \"\${POSIXLY_CORRECT+yes}\" && pc=\"set '\$POSIXLY_CORRECT'\" || pc=unset 
       shopt -q xpg_echo && xe=set || xe=unset 
       echo POSIXLY_CORRECT: \"\$pc\" 
       echo xpg_echo: \$xe 
       echo${e:+ -e} \"$n\n$((n+1))\" 
      " 
      n=$((n+2)) 
     done 
    done 
done 
} 

Sur mon système, votre effet « en tant que root » est reproduit dans le dernier cas (les deux POSIXLY_CORRECT et xpg_echo sont définies).

mode: ___ 
POSIXLY_CORRECT: unset 
xpg_echo: unset 
1\n2 

mode: __e 
POSIXLY_CORRECT: unset 
xpg_echo: unset 
3 
4 

mode: _x_ 
POSIXLY_CORRECT: unset 
xpg_echo: set 
5 
6 

mode: _xe 
POSIXLY_CORRECT: unset 
xpg_echo: set 
7 
8 

mode: p__ 
POSIXLY_CORRECT: set 'y' 
xpg_echo: unset 
9\n10 

mode: p_e 
POSIXLY_CORRECT: set 'y' 
xpg_echo: unset 
11 
12 

mode: px_ 
POSIXLY_CORRECT: set 'y' 
xpg_echo: set 
13 
14 

mode: pxe 
POSIXLY_CORRECT: set 'y' 
xpg_echo: set 
-e 15 
16 

Ces variations du comportement sont la principale raison de l'utilisation printf est préconisée sur écho.

Selon le système et la coquille, parfois printf est une coquille de commande intégré et parfois il est une commande externe, mais son comportement est généralement beaucoup plus cohérente que celle de écho.

Vous pouvez être sûr que chacune des commandes suivantes produira un saut de ligne incorporé et aucun retour à la ligne de fuite:

printf 'foo\nbar' 
printf '%s\n%s' foo bar 

BTW, cela montre mon style préféré d'utiliser des guillemets simples pour la chaîne de format pour indiquer que rien funky y va (par exemple, une extension de paramètre qui insère un spécificateur de format supplémentaire qui n'est pas reflété dans la liste d'arguments).

0

Ubuntu 9.10 utilise en avant tiret comme shell par défaut, au lieu de bash.

Dash peut être envisager une alternative légère de bash, mais il a une incompatibilité mineure. Vous devez spécifier bash explicitement par "Shebang" signe