以下のよう@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
代わりに。