Wie @dessert erklärte , besteht das Problem hier darin, dass Ihr Skript keine Shebang-Zeile enthält . Ohne Shebang sudowird standardmäßig versucht, die Datei mit auszuführen /bin/sh. Ich konnte es nirgendwo dokumentiert finden, aber ich bestätigte es, indem ich den sudoQuellcode überprüfte, in dem ich Folgendes in der Datei fand pathnames.h:
#ifndef _PATH_BSHELL
#define _PATH_BSHELL "/bin/sh"
#endif /* _PATH_BSHELL */
Dies bedeutet "setzen, wenn die Variable _PATH_BSHELLnicht definiert ist, setzen Sie sie auf /bin/sh". Dann configurehaben wir in dem Skript, das im Quell-Tarball enthalten ist:
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
Diese Schleife wird sucht /bin/bash, /usr/bin/sh, /sbin/sh, /usr/sbin/shoder /bin/kshund dann setzt die _PATH_BSHELLzu je nachdem was zuerst gefunden wurde . Da /bin/shwar der erste in der Liste und es existiert, _PATH_BSHELList auf gesetzt /bin/sh. Das Ergebnis all dessen ist, dass die Standard-Shell von, sudosofern nicht anders definiert, lautet /bin/sh.
Also, sudowird standardmäßig die Dinge zum Laufen mit /bin/shund auf Ubuntu, das eine symbolische Verknüpfung zu ist dash, ein minimal POSIX - konform Shell:
$ ls -l /bin/sh
lrwxrwxrwx 1 root root 4 Feb 27 2015 /bin/sh -> dash
Das [[Konstrukt ist eine Bash-Funktion, es ist nicht durch den POSIX-Standard definiert und wird nicht verstanden von dash:
$ bash -c '[[ true ]] && echo yes'
yes
$ dash -c '[[ true ]] && echo yes'
dash: 1: [[: not found
Im Detail in den drei Aufrufen, die Sie versucht haben:
./test.sh
Nein sudo; Wenn keine Shebang-Zeile vorhanden ist, versucht Ihre Shell, die Datei selbst auszuführen. Da Sie ausgeführt werden, bashwird dies effektiv ausgeführt bash ./test.shund funktioniert.
sudo sugefolgt von ./test.sh.
Hier starten Sie eine neue Shell für den Benutzer root. Dies ist die Shell, die in der $SHELLUmgebungsvariablen für diesen Benutzer definiert ist. Unter Ubuntu lautet die Standard-Shell von root bash:
$ grep root /etc/passwd
root:x:0:0:root:/root:/bin/bash
sudo ./test.sh
Hier können Sie sudoden Befehl direkt ausführen. Da die Standard-Shell /bin/shwie oben erläutert ist, führt dies dazu, dass das Skript ausgeführt wird. Dies /bin/shist der Fall dashund schlägt fehl, da dashdies nicht verstanden wird [[.
Hinweis : Die Details zum sudoFestlegen der Standard-Shell scheinen etwas komplexer zu sein. Ich habe versucht, die in meiner Antwort genannten Dateien so zu ändern, dass sie auf zeigen, war /bin/bashaber sudoimmer noch standardmäßig auf /bin/sh. Es muss also einige andere Stellen im Quellcode geben, an denen die Standard-Shell definiert ist. Trotzdem bleibt der Hauptpunkt (der sudostandardmäßig verwendet wird sh) bestehen.
sudo su. Einfach laufensudo -iodersudo -sstattdessen.