2010-05-28 5 views
3

우분투 9.10에서 bash 스크립트를 실행할 때 root로서 실행 중인지 여부에 따라 bash echo의 "-e"옵션과 다른 동작을합니다.echo -e는 우분투의 root 스크립트에서 실행할 때 다르게 동작합니다.

$ sudo ./echo-test 
Running as root 
Testing /bin/echo -e 
foo 
bar 
Testing bash echo -e 
-e foo 
bar 
: 루트로 실행하면

$ ./echo-test 
Testing /bin/echo -e 
foo 
bar 
Testing bash echo -e 
foo 
bar 

, 나는이 출력을 참조하십시오

루트가 아닌 사용자로 실행
$ cat echo-test 
if [ "`whoami`" = "root" ]; then 
    echo "Running as root" 
fi 
echo Testing /bin/echo -e 
/bin/echo -e "foo\nbar" 
echo Testing bash echo -e 
echo -e "foo\nbar" 

, 나는이 출력을 참조하십시오

이 스크립트를 고려

마지막 사례에서 "-e"가 표시됩니다 (두 번째 줄부터 마지막 ​​줄까지 "foo"대신 "-e foo"). 스크립트를 루트로 실행하면 echo 명령은 "-e"가 주어진 것처럼 실행되고 -e가 주어지면 옵션 자체가 표시됩니다.

/bin/echo와 bash echo 사이의 동작에 미묘한 차이가 있음을 이해할 수 있지만 bash echo는 사용자가 호출 한 것과 상관없이 동일하게 동작 할 것으로 기대합니다.

왜 이런 경우인지 아시겠습니까? 이것은 bash echo의 버그입니까?

참고 - 나는 GNU bash는 버전 4.0.33 (1) -release (x86_64에-PC-리눅스 GNU)를 실행하고있어

답변

4

당신은 사용자와 루트가 모두로 떠들썩한 파티를 사용하는 것이 확실하다 그들의 껍질? 스크립트에 "shebang"줄 (#!/bin/bash)을 첫 줄에 넣고 다시 실행하십시오.

+0

#!/bin/bash가 맨 위에 고정됩니다. 따라서 root는 다른 echo를 가진 다른 쉘을 사용해야합니다. 그건 의미가 있습니다. 감사합니다. – user353172

1

POSIXLY_CORRECT 환경 변수의 값을보고 xpg_echo 쉘 옵션 두 가지 상황 모두에서 사용할 수 있습니다.

{ n=1 
for p in '' p; do 
    for x in '' x; do 
     for e in '' e; do 
      printf "\nmode: ${p:-_}${x:-_}${e:-_}\n" 
      test -n "$x" && xx=-s || xx=-u 
      bash ${p:+--posix} -c "    shopt $xx xpg_echo 
       test -n \"\${POSIXLY_CORRECT+yes}\" && pc=\"set '\$POSIXLY_CORRECT'\" || pc=unset 
       shopt -q xpg_echo && xe=set || xe=unset 
       echo POSIXLY_CORRECT: \"\$pc\" 
       echo xpg_echo: \$xe 
       echo${e:+ -e} \"$n\n$((n+1))\" 
      " 
      n=$((n+2)) 
     done 
    done 
done 
} 
내 시스템, 이펙트가 지난 경우에 재현이다 "루트로"(POSIXLY_CORRECT 모두에

및 xpg_echo가 설정됩니다 여기

if test -n "${POSIXLY_CORRECT+yes}"; then 
    pc="set '$POSIXLY_CORRECT'" 
else 
    pc=unset 
fi 
echo POSIXLY_CORRECT: "$pc" 
shopt -q xpg_echo && xe=set || xe=unset 
echo xpg_echo: $xe 

내가 다양한 조합을 검사하는 데 사용되는 테스트 코드입니다). 에코을 통해

mode: ___ 
POSIXLY_CORRECT: unset 
xpg_echo: unset 
1\n2 

mode: __e 
POSIXLY_CORRECT: unset 
xpg_echo: unset 
3 
4 

mode: _x_ 
POSIXLY_CORRECT: unset 
xpg_echo: set 
5 
6 

mode: _xe 
POSIXLY_CORRECT: unset 
xpg_echo: set 
7 
8 

mode: p__ 
POSIXLY_CORRECT: set 'y' 
xpg_echo: unset 
9\n10 

mode: p_e 
POSIXLY_CORRECT: set 'y' 
xpg_echo: unset 
11 
12 

mode: px_ 
POSIXLY_CORRECT: set 'y' 
xpg_echo: set 
13 
14 

mode: pxe 
POSIXLY_CORRECT: set 'y' 
xpg_echo: set 
-e 15 
16 

행동의 이러한 변화는의 printf 의 사용을 옹호하는 가장 큰 이유입니다.

내장 명령 쉘이며, 경우에 따라서는 외부 명령이지만, 그 동작은 일반적으로 훨씬 더 일관성 에코의보다.

다음과 같은 명령을 각각 포함 된 줄 바꿈없이 뒤에 줄 바꿈 발생시킬 것이라는 점을 확실 할 수있다 : 형식 문자열은 아무것도 것을 나타 내기 위해 BTW

printf 'foo\nbar' 
printf '%s\n%s' foo bar 

,이 작은 따옴표를 사용하여 내 선호하는 스타일을 보여줍니다 funky가 들어갑니다 (예 : 인수 목록에 반영되지 않은 추가 형식 지정자를 삽입하는 매개 변수 확장).

0

우분투 9.10 이후에는 bash 대신 dash가 기본 쉘로 사용됩니다.

대시는 bash의 경량 대체품으로 간주 될 수 있지만 약간의 비 호환성이 있습니다. bash를 명시 적으로 "Shebang"기호로 지정해야합니다.

관련 문제