2012-05-16 2 views
0

저는 eval 문이 어떻게 작동하는지 이해하려고합니다. 그들이 필요한 있다면 Csh eval statement?

eval '$SOME_DIR/util/dbget.pl \ 
     VARIABLE1 \ 
     VARIABLE2 \ 
     VARIABLE3 \ 
     VARIABLE4 ' 

따옴표

은 (그들을하는 방법을 잘 이상한 왼쪽을 가리키는 프랑스어 보이는 것들이며, 다음은 코드의 조각은 내가 이해하지 못하는 것을 찾고 있어요입니다 csh에서).

어쨌든 몇 가지 연구를 한 후에 나의 초기 아이디어는 eval이 문자 그대로 명령 줄에서 해당 문자열을 입력한다는 것입니다. 즉 .pl 스크립트를 실행한다는 의미입니다 ... 그 변수로 무엇을하는지 확신 할 수 없습니다. 이 코드 위의 주석은 "몇 가지 매개 변수 얻기"라고했지만 그게 무슨 뜻인지는 잘 모르겠습니다.

eval 'VARIABLE'이 (가) 변수를 초기화합니까? 이것은 eval 후에 코드가 이제 초기화 된 것처럼 이러한 변수를 사용하기 때문에 계속 발생하는 것 같습니다 (명령문 검사 등).

필자는 이러한 종류의 스크립팅을 처음 접했을뿐 아니라 대형 저장소로 뛰어 들었습니다. 어떤 도움을 주셔서 감사합니다.

+0

'set -vx'로 쉘 디버깅을 켜십시오. (나는 csh에 맞다고 생각합니다). 그런 다음 다양한 처리 단계에서 변수 값을 볼 수 있습니다. 행운을 빕니다. – shellter

+0

역 따옴표는 키보드의 왼쪽 상단, 즉 1 키 옆에 있습니다 (일반적으로). 행운을 빕니다. – shellter

답변

2

좋아, 백틱은 그 사이의 명령 출력으로 바뀝니다.

eval은 출력을 받아 입력 한 것처럼 실행합니다.

이 경우 나는 perl이 set VARIABLE1=value1 또는 setenv VARIABLE1 value1과 같은 일부 변수 할당을 출력한다고 가정합니다. 어떤 경우에 위의 eval 이후에 나중에을 csh 코드에서 사용할 수있게해야합니다.

eval없이 .pl 스크립트 (Perl이라고 가정)를 실행해도 csh 프로세스의 환경에는 영향을 미치지 않습니다. eval을 사용하면 Perl 코드에 해당 환경을 수정할 권한이 부여됩니다.

이것은 펄의 출력이 csh, btw를위한 것인지를 알아야한다는 것을 의미합니다. sh/bash에서는 변수 할당의 구문이 다릅니다.

ETA 더 시도하면 설명 :

당신이 할 경우이 :

$SOME_DIR/util/dbget.pl 

당신은 당신의 화면에 인쇄 변수 할당 문의 무리를 얻을. 이것은 유용하지 않으며 쉘의 실제 변수에는 아무런 영향을 미치지 않습니다.

당신이 할 경우이 :

echo `$SOME_DIR/util/dbget.pl` 

당신은 더 로터리 방식으로 동일한 결과를 얻을 : 대신 화면에 직접 인쇄 펄 코드로, 그것은 CSH echo에 전달되는 식으로 인쇄하는 것 명령을 입력 한 다음 echo이 화면에 실제로 인쇄됩니다. 그 구분은 미묘하지만 중요합니다. backticks는 perl에서 제어권을 빼앗아 쉘의 손에 넣습니다. 쉘이 출력을 캡처하면 변수에 저장하거나 파일에 쓰거나 Perl 코드를 다시 작성하지 않아도되도록 처리 할 수 ​​있습니다. Perl은 여전히 ​​인쇄 중입니다.이렇게하면

는 :

eval `$SOME_DIR/util/dbget.pl` 

그런 다음 어떤 쉘이하는 것은이 프롬프트에 입력 된 것처럼 펄의 출력을 실행합니다. 이것은 매우 강력합니다. 주변 프로그램이 프로그램을 작성한 사람이 본 적이없는 코드를 실행하기 때문에 위험합니다. 그러므로 코드의 소스 (이 경우 펄 스크립트)를 손상시키지 않아야합니다 (intentinonally 또는 otherwise).

+0

백틱과 평가에 대한 좋은 설명. 모두에게 행운을 빕니다. – shellter

+0

예, 그 사실을 눈치 채고 내 의견을 수정했습니다. 이것을 곧 삭제할 것입니다 :-) – shellter

+0

OK 펄 스크립트가 변수를 설정하는 것이 합리적입니다. 그러나 VARIABLE1을 평가 한 후의 요점은 무엇입니까? csh 코드에서 사용할 수 있도록하기 위해해야 ​​할 일이 있습니까? 나는 그것이 당신의 대답이 말하는 것이라고 생각하지만, 나는 왜 그런지 정말로 이해하지 못합니다. – JDS

0

eval과 백틱 구문은 모두 csh 매뉴얼 페이지에서 설명합니다.

Linux 시스템을 사용하는 경우 csh은 원래 csh C 쉘의 향상된 버전 인 tcsh 일 가능성이 큽니다. 이러한 특정 기능은 csh 및 tcsh에서 모두 동일합니다. 백틱 신택스는 "명령 대체"를 호출합니다.

명령 subsitution

명령 대체가 동봉 명령으로 표시됩니다 :

(백틱 문자의 가격 인하의 특별 대우를 방지하기 위해 약간의 비틀기와 함께) 내 시스템에서 tcsh 매뉴얼 페이지를 인용 [backticks]에. 이러한 명령의 출력 은 일반적으로 공백 인 경우 별도의 단어로 분리되고, 탭과 개행 문자는 무시됩니다. 이 텍스트 다음에 은 원래 문자열을 대체합니다. 큰 따옴표 (") 내에서만 줄 바꿈이 새로운 단어를 강제;. 공백과 탭은 보존됩니다

을 어떤 경우, 단일 최종 개행 문자는 새로운 단어를 강요하지 않습니다이 명령 교체를 따라서 가능하다는 것을 을합니다. 명령이 전체 라인을 출력하는 경우에도, 단어의 일부만 을 얻었다

과 :.

평가 인수 ...

,536,

(sh (1)에서와 같이) 인수는 현재 쉘의 컨텍스트에서 실행 된 결과로 쉘에 대한 입력으로 읽히고 결과는 입니다. 대체로 대체 전에 구문 분석이 수행되므로 명령 또는 변수 대체 결과로 생성 된 명령을 실행하는 데 사용됩니다. eval 사용 예제는 tset (1)을 참조하십시오.