Comme l'a expliqué @dessert , le problème ici est que votre script n'a pas de ligne shebang . Sans shebang, sudo
tentera par défaut d'exécuter le fichier à l'aide de /bin/sh
. Je ne l'ai trouvé nulle part, mais j'ai confirmé en vérifiant le sudo
code source où j'ai trouvé ce qui suit dans le fichier pathnames.h
:
#ifndef _PATH_BSHELL
#define _PATH_BSHELL "/bin/sh"
#endif /* _PATH_BSHELL */
Cela signifie "définir si la variable _PATH_BSHELL
n'est pas définie, définissez-la sur /bin/sh
". Ensuite, dans le configure
script inclus dans l'archive tar source, nous avons:
for p in "/bin/bash" "/usr/bin/sh" "/sbin/sh" "/usr/sbin/sh" "/bin/ksh" "/usr/bin/ksh" "/bin/bash" "/usr/bin/bash"; do
if test -f "$p"; then
found=yes
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $p" >&5
$as_echo "$p" >&6; }
cat >>confdefs.h <<EOF
#define _PATH_BSHELL "$p"
EOF
break
fi
done
Cette boucle cherchera /bin/bash
, /usr/bin/sh
, /sbin/sh
, /usr/sbin/sh
ou /bin/ksh
et définit ensuite la _PATH_BSHELL
à celui qui a été trouvé en premier . Étant donné qu'il /bin/sh
était le premier de la liste et qu'il existe, _PATH_BSHELL
est défini sur /bin/sh
. Le résultat de tout cela est que le shell par défaut de sudo
sauf indication contraire est /bin/sh
.
Donc, sudo
par défaut, les choses seront exécutées en utilisant /bin/sh
et, sur Ubuntu, c'est un lien symbolique vers dash
un shell compatible POSIX minimal:
$ ls -l /bin/sh
lrwxrwxrwx 1 root root 4 Feb 27 2015 /bin/sh -> dash
La [[
construction est une fonctionnalité bash, elle n'est pas définie par la norme POSIX et n'est pas comprise par dash
:
$ bash -c '[[ true ]] && echo yes'
yes
$ dash -c '[[ true ]] && echo yes'
dash: 1: [[: not found
En détail, dans les trois invocations que vous avez essayées:
./test.sh
Non sudo
; en l'absence d'une ligne de shebang, votre shell tentera d'exécuter le fichier lui-même. Puisque vous exécutez bash
, cela fonctionnera bash ./test.sh
et fonctionnera efficacement .
sudo su
suivi de ./test.sh
.
Ici, vous lancez un nouveau shell pour l'utilisateur root
. Ce sera le shell défini dans la $SHELL
variable d'environnement pour cet utilisateur et, sur Ubuntu, le shell par défaut de root est bash
:
$ grep root /etc/passwd
root:x:0:0:root:/root:/bin/bash
sudo ./test.sh
Ici, vous laissez sudo
exécuter directement la commande. Étant donné que son shell par défaut est /bin/sh
comme expliqué ci-dessus, cela lui fait exécuter le script /bin/sh
, ce qui est dash
et il échoue car dash
ne comprend pas [[
.
Remarque : les détails de la sudo
définition du shell par défaut semblent être un peu plus complexes. J'ai essayé de changer les fichiers mentionnés dans ma réponse pour pointer vers, /bin/bash
mais j'étais sudo
toujours en défaut /bin/sh
. Il doit donc y avoir d'autres endroits dans le code source où le shell par défaut est défini. Néanmoins, le point principal (par sudo
défaut sh
) est toujours d'actualité.
sudo su
. Exécutez simplementsudo -i
ou à lasudo -s
place.