Gibi @dessert açıkladı , buradaki sorun senaryonuzun sahip olmamasıdır mesele hattını . Bir shebang olmadan, sudovarsayılan kullanarak dosyayı çalıştırmak için çalışır /bin/sh. Ben hiçbir yerde belgelenmiş bulamadı, ama ben sudodosyada aşağıdakini buldum kaynak kodu kontrol ederek onayladı pathnames.h:
#ifndef _PATH_BSHELL
#define _PATH_BSHELL "/bin/sh"
#endif /* _PATH_BSHELL */
Bu, "değişken _PATH_BSHELLtanımlanmadıysa ayarla, " olarak ayarla "anlamına gelir /bin/sh. Ardından, configurekaynak tarball'a dahil edilen senaryoda:
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
Bu döngü arayacaktır /bin/bash, /usr/bin/sh, /sbin/sh, /usr/sbin/shveya /bin/kshdaha sonra ayarlar _PATH_BSHELLiçin ilk bulunmuştur hangisi . Yana /bin/shlistedeki ilk oldu ve eğer mümkünse _PATH_BSHELLolarak ayarlanır /bin/sh. Tüm bunların sonucu, sudoaksi belirtilmedikçe varsayılan kabuğunun olmasıdır /bin/sh.
Bu nedenle, sudovarsayılan olarak /bin/shve Ubuntu'da bu, bir dashPOSIX uyumlu kabuk için bir sembolik bağlantı olan şeyleri çalıştırmaya çalışır :
$ ls -l /bin/sh
lrwxrwxrwx 1 root root 4 Feb 27 2015 /bin/sh -> dash
[[Yapı, POSIX standardına göre bir darbe özelliği tanımlanmamıştır ve ile anlaşılamamıştır dash:
$ bash -c '[[ true ]] && echo yes'
yes
$ dash -c '[[ true ]] && echo yes'
dash: 1: [[: not found
Ayrıntılı olarak, üç çağrıda denediniz:
./test.sh
Hayır sudo; bir sapma çizgisinin yokluğunda, kabuğunuz dosyanın kendisini yürütmeye çalışır. Koştuğunuz için bash, bu etkili bir şekilde çalışır bash ./test.shve çalışır.
sudo suardından ./test.sh.
Burada, kullanıcı için yeni bir kabuk başlatıyorsunuz root. Bu, $SHELLo kullanıcı için ortam değişkeninde tanımlanmış olan kabuk olacaktır ve Ubuntu'da kökün varsayılan kabuğu bash:
$ grep root /etc/passwd
root:x:0:0:root:/root:/bin/bash
sudo ./test.sh
Burada, sudokomutu doğrudan yürütmenize izin veriyorsunuz . Varsayılan kabuk olduğundan /bin/shyukarıda açıklandığı bu komut dosyasını çalışmasını sağlar /bin/sholan dashve o zamandan beri başarısız dashanlamıyor [[.
Not : sudoVarsayılan kabuğun nasıl ayarlandığına dair ayrıntılar biraz daha karmaşık görünmektedir. Cevabımda belirtilen dosyaları değiştirmeyi denedim /bin/bashama sudohala varsayılan /bin/sh. Bu nedenle, kaynak kodda varsayılan kabuğun tanımlandığı başka yerler olmalıdır. Bununla birlikte, ana nokta ( sudovarsayılan olarak sh) hala duruyor.
sudo su. Sadece koşsudo -iya dasudo -sonun yerine.