Wie @dessert erklärte , besteht das Problem hier darin, dass Ihr Skript keine Shebang-Zeile enthält . Ohne Shebang sudo
wird standardmäßig versucht, die Datei mit auszuführen /bin/sh
. Ich konnte es nirgendwo dokumentiert finden, aber ich bestätigte es, indem ich den sudo
Quellcode ü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_BSHELL
nicht definiert ist, setzen Sie sie auf /bin/sh
". Dann configure
haben 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/sh
oder /bin/ksh
und dann setzt die _PATH_BSHELL
zu je nachdem was zuerst gefunden wurde . Da /bin/sh
war der erste in der Liste und es existiert, _PATH_BSHELL
ist auf gesetzt /bin/sh
. Das Ergebnis all dessen ist, dass die Standard-Shell von, sudo
sofern nicht anders definiert, lautet /bin/sh
.
Also, sudo
wird standardmäßig die Dinge zum Laufen mit /bin/sh
und 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, bash
wird dies effektiv ausgeführt bash ./test.sh
und funktioniert.
sudo su
gefolgt von ./test.sh
.
Hier starten Sie eine neue Shell für den Benutzer root
. Dies ist die Shell, die in der $SHELL
Umgebungsvariablen 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 sudo
den Befehl direkt ausführen. Da die Standard-Shell /bin/sh
wie oben erläutert ist, führt dies dazu, dass das Skript ausgeführt wird. Dies /bin/sh
ist der Fall dash
und schlägt fehl, da dash
dies nicht verstanden wird [[
.
Hinweis : Die Details zum sudo
Festlegen 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/bash
aber sudo
immer 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 sudo
standardmäßig verwendet wird sh
) bestehen.
sudo su
. Einfach laufensudo -i
odersudo -s
stattdessen.