以下のよう@dessertは説明し、ここでの問題は、あなたのスクリプトが持っていないということですシェバング行を。シバンがない場合、sudoデフォルトではを使用してファイルを実行しようとします/bin/sh。どこにも文書化されていませんでしたsudoが、次のファイルのソースコードを確認して確認しましたpathnames.h。
#ifndef _PATH_BSHELL
#define _PATH_BSHELL "/bin/sh"
#endif /* _PATH_BSHELL */
これは、「変数_PATH_BSHELLが定義されていない場合は設定し、それを設定する/bin/sh」ことを意味します。次に、configureソースtarballに含まれているスクリプトに次のように記述します。
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標準で定義されていないとが理解されていない、bashの機能ですdash:
$ bash -c '[[ true ]] && echo yes'
yes
$ dash -c '[[ true ]] && echo yes'
dash: 1: [[: not found
詳細には、次の3つの呼び出しで試しました。
./test.sh
いいえsudo; シバン行がない場合、シェルはファイル自体を実行しようとします。を実行しているのでbash、これは効果的に実行されbash ./test.sh、機能します。
sudo suが続き./test.shます。
ここでは、ユーザーの新しいシェルを開始していますroot。これは$SHELL、そのユーザーの環境変数で定義されているシェルです。Ubuntuでは、ルートのデフォルトシェルは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代わりに。