Як пояснив @dessert , проблема тут полягає в тому, що у вашого сценарію немає рядка shebang . Без шебангу, sudoза замовчуванням намагатиметься запустити файл за допомогою /bin/sh. Я не міг знайти його документально ніде, але я підтвердив, перевіривши sudoвихідний код, де я знайшов у файлі таке pathnames.h:
#ifndef _PATH_BSHELL
#define _PATH_BSHELL "/bin/sh"
#endif /* _PATH_BSHELL */
Це означає "встановити, якщо змінна _PATH_BSHELLне визначена, встановіть її на /bin/sh". Потім у configureсценарії, включеному у вихідний тарбол, ми маємо:
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
Цей цикл буде шукати /bin/bash, /usr/bin/sh, /sbin/sh, /usr/sbin/shабо , /bin/kshа потім встановлює _PATH_BSHELLв якій був знайдений перший . Оскільки /bin/shбуло першим у списку і він існує, _PATH_BSHELLвстановлено /bin/sh. Результатом всього цього є те, що оболонка за замовчуванням, sudoякщо не визначено інше, є /bin/sh.
Отже, sudoза замовчуванням використовуються речі, що використовують, /bin/shа на Ubuntu - це посилання на dashмінімальну оболонку, сумісну з POSIX:
$ ls -l /bin/sh
lrwxrwxrwx 1 root root 4 Feb 27 2015 /bin/sh -> dash
[[Конструкція особливість Баш, воно не визначено стандартом POSIX і не розуміють dash:
$ bash -c '[[ true ]] && echo yes'
yes
$ dash -c '[[ true ]] && echo yes'
dash: 1: [[: not found
Детально, у трьох викликах, які ви спробували:
./test.sh
Ні sudo; за відсутності рядка shebang, ваша оболонка спробує виконати сам файл. Оскільки ви біжите bash, це ефективно працювати bash ./test.shі працювати.
sudo suслідом за ним ./test.sh.
Тут ви запускаєте нову оболонку для користувача root. Це буде будь-яка оболонка, визначена в $SHELLзмінній середовища для цього користувача, а для Ubuntu оболонка root за замовчуванням bash:
$ grep root /etc/passwd
root:x:0:0:root:/root:/bin/bash
sudo ./test.sh
Тут ви дозволяєте sudoвиконувати команду безпосередньо. Оскільки оболонка за замовчуванням /bin/shяк описано вище, це призводить до запуску сценарію /bin/sh, який є, dashі він не вдається, оскільки dashне розуміє [[.
Примітка : подробиці того, як sudoвстановлюється оболонка за замовчуванням, здаються трохи складнішими. Я спробував змінити файли, згадані у моїй відповіді, на які вказував, /bin/bashале sudoвсе-таки був дефолт /bin/sh. Отже, у вихідному коді повинні бути деякі інші місця, де визначена оболонка за замовчуванням. Тим не менш, основна суть (яка sudoза замовчуванням sh) все ще залишається.
sudo su. Просто запустітьsudo -iабоsudo -sзамість цього.