Seperti yang dijelaskan oleh @dabut , masalahnya di sini adalah skrip Anda tidak memiliki garis shebang . Tanpa shebang, sudoakan default untuk mencoba menjalankan file menggunakan /bin/sh. Saya tidak dapat menemukannya didokumentasikan di mana pun, tetapi saya mengonfirmasi dengan memeriksa sudokode sumber tempat saya menemukan yang berikut dalam file pathnames.h:
#ifndef _PATH_BSHELL
#define _PATH_BSHELL "/bin/sh"
#endif /* _PATH_BSHELL */
Ini berarti "atur jika variabel _PATH_BSHELLtidak ditentukan, atur ke /bin/sh". Kemudian, dalam configureskrip yang disertakan dalam tarball sumber, kami memiliki:
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
Lingkaran ini akan mencari /bin/bash, /usr/bin/sh, /sbin/sh, /usr/sbin/shatau /bin/kshdan kemudian menetapkan _PATH_BSHELLuntuk mana ditemukan pertama kali . Karena /bin/shitu yang pertama dalam daftar dan itu ada, _PATH_BSHELLdiatur ke /bin/sh. Hasil dari semua ini adalah bahwa shell default sudokecuali ditentukan lain /bin/sh.
Jadi, sudoakan secara default menjalankan hal-hal menggunakan /bin/shdan, pada Ubuntu, yang merupakan symlink ke dash, shell minimal yang sesuai dengan POSIX:
$ ls -l /bin/sh
lrwxrwxrwx 1 root root 4 Feb 27 2015 /bin/sh -> dash
The [[konstruk fitur bash, itu tidak didefinisikan oleh standar POSIX dan tidak dimengerti oleh dash:
$ bash -c '[[ true ]] && echo yes'
yes
$ dash -c '[[ true ]] && echo yes'
dash: 1: [[: not found
Secara terperinci, dalam tiga doa Anda mencoba:
./test.sh
Tidak ada sudo; tanpa adanya garis shebang, shell Anda akan mencoba untuk mengeksekusi file itu sendiri. Karena Anda menjalankan bash, ini akan berjalan bash ./test.shdan bekerja secara efektif .
sudo sudiikuti oleh ./test.sh.
Di sini, Anda memulai shell baru untuk pengguna root. Ini akan menjadi apa pun shell yang didefinisikan dalam $SHELLvariabel lingkungan untuk pengguna itu dan, pada Ubuntu, shell default root adalah bash:
$ grep root /etc/passwd
root:x:0:0:root:/root:/bin/bash
sudo ./test.sh
Di sini, Anda membiarkan sudomenjalankan perintah secara langsung. Karena shell defaultnya /bin/shseperti dijelaskan di atas, ini menyebabkannya menjalankan skrip dengan /bin/sh, yang mana dashdan gagal karena dashtidak mengerti [[.
Catatan : perincian tentang bagaimana sudomenyetel shell default tampaknya sedikit lebih rumit. Saya mencoba mengubah file yang disebutkan dalam jawaban saya untuk menunjuk /bin/bashtetapi sudomasih default ke /bin/sh. Jadi harus ada beberapa tempat lain dalam kode sumber di mana shell default didefinisikan. Namun demikian, poin utama (yang sudodefaultnya sh) masih berlaku.
sudo su. Jalankan sajasudo -iatausudo -ssebaliknya.