Tcl의 외부 커맨드

admin의 아바타

Tcl은 Tcl 커맨드 이외의 커맨드를 지정하면 외부 커맨드를 실행합니다. 실행된 외부 커맨드의 표준 출력은 Tcl의 커맨드와 마찬가지로 커맨드의 리턴값으로 리턴됩니다.

# grep은 외부 커맨드 입니다.
% grep -n hoge *.c | wc

위와 같이 외부 커맨드의 하나인 grep을 알고 사용 한다면 편리하겠지만, 모르는 사용자는 Tcl의 커맨드라 착각을 하게 되어 다른 플랫폼에 이식시에 문제가 될것입니다. 외부 커맨드의 실행을 막고자 한다면 auto_noexec 변수를 지정합니다. Tcl은 auto_noexec 변수가 존재한다면, 외부 커맨드의 실행을 막고 에러를 리턴합니다.

# 변수의 값은 무엇이든 상관없습니다.
% set auto_noexec 1
 
% grep -n hoge *.c | wc
invalid command name "grep"

exec 커맨드

exec 커맨드는 외부 커맨드를 실행하는데 사용됩니다. exec 커맨드는, auto_noexec 변수 존재와 상관없이, 외부 커맨드를 실행합니다.

exec grep -n hoge *.c | wc

외부 커맨드는 유닉스의 쉘로 실행할 때와 마찬가지로, 표준 입출력 리다이렉션 파이프라인에 대응합니다. 또, glob 커맨드의 정규표현을 사용하여 파일명을 지정하는것도 가능합니다.

exec 커맨드 구문

옵션 설명
-keepnewline 커맨드 출력의 new line 문자를 삭제하지 않으며, 첫번째 인자로 지정해야 합니다.
? 옵션의 끝을 나타냅니다.
| 커맨드의 표준 출력을 파이프 라인으로 연결합니다.
|& 커맨드의 표준 출력과 표준 에러 출력을 파이프 라인으로 연결합니다.
< fileName 지정한 파일로부터 입력합니다.
<@ fileId 지정한 파일 스트림으로 부터 입력합니다.
≪ value 지정한 문자열을 입력합니다.
> fileName 표준 출력을 지정한 파일로 출력합니다.
2> fileName 표준 에러 출력을 지정한 파일로 출력합니다.
>& fileName 표준 출력과 표준 에러 출력을 지정한 파일로 출력합니다.
≫ fileName 표준 출력을 지정한 파일에 추가합니다.
2≫ fileName 표준 에러 출력을 지정한 파일에 추가합니다.
≫& fileName 표준 출력과 표준 에러 출력을 지정한 파일에 추가합니다.
>@ fileId 표준 출력을 지정한 파일 스트림에 출력합니다.
2>@ fileId 표준 에러 출력을 지정한 파일 스트림에 출력합니다.
>&@ fileId 표준 출력과 표준 에러 출력을 지정한 파일 스트림에 출력합니다.
& 커맨드를 백그라운드로 실행하며, 커맨드의 마지막에 지정합니다.

아래는 exec 커맨드의 사용예입니다.

% exec grep -n hoge *.c | wc >& log.txt &

Windows의 예

Windows 환경에서도 외부 커맨드로써, DOS, Win16, Win32, Cygnus등의 커맨드를 실행할수 있습니다. Windows 환경에서는 파일의 확장자에 어플리케이션이 연결되어 있기 때문에, 그것을 응용하면 웹 부라우저로 HTML 파일을 여는것도 가능합니다.

exec $env(COMSPEC) /c start index.html &

간혹 문제가 될 소지가 있기 때문에, HTML 파일명의 패스는, file nativename 커맨드를 사용하여 패스를 변한하여 사용하는것이 안전할 것 입니다.