2013-09-29 2 views
0

내 스크립트 :예기치 않은 출력과 오류 리디렉션

#!/bin/bash 

generic() 
{ 

    echo $1; 
    $1 > temp.txt 2>&1 
} 

generic "echo asd > /dev/null 2>&1; echo temp" 

예상 결과 :

  1. "ASD"는 "임시"임시로
  2. 가야한다 널 (null)는/dev /로 이동한다 .txt 파일.

실제 결과 :

  1. "ASD>/디바이스/널 2> & 1] 온도 에코"TEMP.TXT 파일로 진행한다.

첫 번째 echo 문만 실행되고 출력이 temp.txt로 리디렉션되는 이유는 무엇입니까? 또한 두 번째 명령이 문자열로 처리되는 이유는 무엇입니까?

답변

0

당신은 spec

을 (이것은 배쉬는 실제 사양이 없기 때문에 배쉬는 POSIX 쉬에 호환 될 수 있도록하려고합니다.의 POSIX 쉬 사양이지만, 불필요한 복잡성의 crapload를 추가합니다. 당신은 사용해야 읽을 필요 #!/bin/sh 대신 초보자이고 정상적인 스크립트를 작성하려는 경우)

특히 하나의 명령 이외의 다른 변수에는 변수를 저장할 수 없습니다. 변수에서 실행하는 경우 $1으로 실행하면

변수가 IFS 변수 내에있는 경우 발생하는 부분을 분리합니다. 당신이 예에서, 다음의 토큰 목록이 결과 :

  1. 메아리
  2. ASD
  3. >
  4. /디바이스/
  5. 2> & 1;
  6. 는 C execlp("echo", "echo", "asd", ">", "/dev/null", "2>&1;", "echo", "temp", NULL); 쓰기에 해당
  7. 가 임시

이리스트는 다음 방법으로 실행된다 에코.

대신 "$1"을 작성한 경우 셸에서 인수없이 echo asd > /dev/null 2>&1; echo temp이라는 프로그램을 시작하려고합니다.

문자열을 셸 명령 줄로 다시 계산하려면 eval : eval "$1"을 사용해야합니다. 그러나 보안 관련 사항에 유의하십시오! 평가는 많은 것으로 간주됩니다.