으로 @dessert 설명 , 여기에 문제는 스크립트가없는 것입니다 오두막 라인을 . shebang이 없으면 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
.
따라서 우분투에서는 최소한 POSIX 호환 쉘에 대한 심볼릭 링크를 sudo
사용하여 작업을 실행하도록 기본 설정됩니다 ./bin/sh
dash
$ 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에서 루트의 기본 쉘은 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
대신 실행하십시오 .