2011-08-13 4 views
2
$ date > '< abcd' 
$ cat '< abcd' 
<something> 
$ tclsh8.5 
% exec cat {< abcd} 
couldn't read file " abcd": no such file or directory 

whoops. 이는 'exec'사양 때문입니다.'<'를 포함하는 명령 줄 매개 변수를 'exec'에 전달하는 방법

arg (또는 args 쌍)가 아래에 설명 된 양식 중 하나를 갖는 경우 exec에 의해 사용되어 하위 프로세스 간의 입력 및 출력 흐름을 제어합니다. 이러한 인수는 서브 프로세스에 전달되지 않습니다. 예 : "< fileName에"와 같은 형태로, 파일 이름 중 하나를 중재하는 공간 "과"< "나 같은 인수에 별도의 인수에있을 수 있습니다.

이 문제를 해결하는 방법이 있나요?

+0

이 루프를 닫으려면 다운 스트림 프로그램에 '<'로 시작하는 인수를 전달할 수없는 'exec'의 제한 사항 인 것 같습니다.리디렉션 연산자가 별도의 단어가되도록 요구하기 위해 'exec'사본을 패치했습니다. 그러므로 cat user188012

답변

4

값을 인수로 전달해야합니까? 그렇지 않은 경우 다음과 같이 사용할 수 있습니다.

set strToPass "< foo" 
exec someProgram << $strToPass 

파일 이름의 경우 정규화 된 이름을 대신 전달할 수 있습니다. 완전한 이름은 file normalize 얻을 수있다 :

exec someProgram [file normalize "< foo"]  ;# Odd filename! 

하지만 필요< (또는 >)가 첫 번째 문자 인 인수를 전달할 경우, 당신은 막히다. exec 명령은 항상 리디렉션과 같은 인수를 사용합니다. Unix 쉘과는 달리, 따옴표를 사용하여이를 해결할 수는 없습니다.

하지만 도우미 프로그램을 사용할 수 있습니다. 따라서, 유닉스에서이 작업을 수행 할 수 있습니다

exec /bin/sh -c "exec someProgram \"$strToPass\"" 

(서브 프로그램은 당신이 당신이 정말로 원하는 인수를 전달 실행할 것 자체를 대체 당신은 앞에 백 슬래시를 넣어 string map 또는 regsub을 사용해야 할 수도 있습니다.)

Windows에서는 배치 파일을 작성하고 실행해야합니다. 특히 GUI 응용 프로그램의 경우 많은주의 사항과 부작용이 있습니다.

+0

'<'로 시작하는 인수를 전달하려는 경우에 문제가 있다는 것을 확인해 주셔서 감사합니다. 예, 저는 위의 방법을 혼합하거나 Tcl 사본을 패치하려고합니다 (저는 프로그램과 함께 통역사를 패키지로 만들 수 있습니다). – user188012

0
?

이를 시도

% exec {cat < abcd} 
+0

죄송합니다. 예상대로 작동하지 않습니다. 'cat user188012

0

시도 :

설정은 myfile "< ABCD"

,

간부 고양이 $의 myfile을

+0

작동하지 않습니다. (실제로 시도했지만 프롬프트에 명령을 붙여 넣었습니다.) – user188012

+0

나는 그것을 시험해 볼 수 없기 때문에 내 컴퓨터에 있지 않다. <를 백 슬래시로 이스케이프 해 봅니다. – TrojanName

+1

확실히 작동하지 않습니다. 'exec'가 단어의 시작 부분에서'<'를 발견하면 그것이 리다이렉션이고, 시작 부분에 있지 않으면 인수의 시작 부분에 있지 않습니다. 이것은 Tcl의 잘못된 오작동입니다. –

2

하나의 간단한 해결책 : 약간 더 복잡한

exec cat "./< abcd" 

하나 :

exec sh -c {cat '< abcd'} 

# also 
set f {< abcd} 
exec sh -c "cat '$f'" 

page on the Tcl Wiki 회담 리디렉션 문자로을 시작하지 않는 단어를 보장 약간의 문제에 관해서.

+0

나는이 문제와 위키 링크에 대한 적절한 해결책을 얻기 위해 upvote를 주었지만 나의 경우에는 'cat'명령은 설명의 목적으로 만 사용되었다. '에코'는 내가 실제로하고있는 것과 더 나은 유사점이었을 것이다. 스트링을 그대로 다운 스트림 프로그램에 전달하고 싶습니다. – user188012

+0

당신은'sh -c "에있는 cmd를 포장 할 수 없습니까?"'? 이렇게하면'<'기호가 exec의 범위를 벗어납니다. –

+0

예, 할 수 있습니다. 하지만 그때 나는 지옥을 인용하기로 내려갈 수 있습니다. 나는 그 일을 피하기 위해 열심히 노력하고 있습니다. :) Tcl의 exec는 '<'로 시작하는 인수를 다운 스트림 프로그램에 전달할 수없는 것처럼 보입니다. – user188012

관련 문제