Linux Tcsh 설명 O. 버전(Version) Cornell 6.06.00 29 April 1995. I. 파일이름(Filename) tcsh : 파일이름 completion과 명령라인 편집이 가능한 C shell. II. 사용법(Usage) tcsh [-bcdefFimnqstvVxX] [-Dname[=value] [arg ...] tcsh -l III. 설명(Description) tcsh 는 완벽하게 호환되는 버클리 Unix C 쉘 즉, csh 버전을 강화한 것이 다. 상호작용하는 로그인 쉘과 쉘 스크립트 명령 프로세서를 모두 사용할 수 있 는 명령 해석기이 다. 또한 명령라인 편집기, 프로그램할 수 있는 단어 완성, 철자 정정기능, 히스토리 기능, 작 업 제어기능 그리고 C와 비슷한 구문을 포함 한다. 새로운 기능들이란 부분에서 C 쉘에 대한 tcsh의 향상된 기능을 서술한다. 이 매뉴얼에서는 4.4BSD C 쉘에 없는 tcsh의 기능들은 (+)가 붙어있고 C 쉘 의 기능들과 같은 것은 (u)가 붙어있다. IV. 인자(옵션) 처리(Argument Processing) 쉘에서 첫 번째 인자가 '-'이면 그것은 로그인 쉘이다. 또한 로그인 쉘은 인 자로 -l 플래그로 쉘을 불러냄으로서 정의되어질 수 있다. 플래그 인자들의 나머지는 아래와 같이 해석한다. 1. -b 옵션 처리로부터 break를 강제로 보낸다. 다음에 나오는 쉘 옵션들이 없 는 것으로 취급한 다. 나머지 인자들은 쉘 옵션으로 해석되지 않는다. 이것 은 쉘 스크립트를 혼동 또는 가능 한 구실없이 선택사항들을 통과하기위해 사 용될 수 있다. 쉘은 이 선택사항없이 사용자설 정 ID 스크립트를 실행할 수 없다. 2. -c 명령들은 다음 인자(표현되어진 인자 또는 한 글자로된 인자)로 부터 읽 고 참조하기 위해 서 명령 쉘 변수에 저장되고 실행한다. 나머지 인자들은 argv 쉘 변수로 대치된다. 3. -d 쉘은 로그인 쉘이거나 아니거나 스타트업, 셧다운에 기술된 ~/.cshdirs 로 부터 디렉토리 스택을 로드한다. (+) 4. -D name[=value] 환경변수이름 name 의 값 value 로 설정한다. 단, Domain/OS일 때만 가 능하다. (+) 5. -e 실행된 명령이 비정상적으로 끝나거나 0이 아닌 상태이면 쉘을 종료한다. 6. -f 쉘이 ~/.tcshrc를 무시하여 더 빠르게 실행된다. 7. -F 쉘은 프로세스를 만들기위해 vfork() 대신에 fork()를 사용한다. 단, Convex/OS일 때만 사 용가능.(+) 8. -i 쉘은 상호작용하고 상위레벨 입력을 위해 프롬프트를 표시한다. 터미널이 아닐지라도 출력 한다. 쉘의 입출력이 끝나면 이 옵션없이 쉘은 상호작용한 다. 9. -l 쉘을 로그인 쉘로 설정한다. -l 이 유일한 플래그로 지정된 경우에만 적 용할 수 있다. 10. -m 유효 사용자가 아니더라도 ~/.tcshrc 를 로드한다. su 명령의 새로운 버전 들은 -m을 통과 시킨다.(+) 11. -n 쉘은 단지 명령들을 설명만하고 실행하지는 않는다. 이것은 쉘 스크립트 를 디버깅하는 것 을 도와준다. 12. -q 쉘은 SIGQUIT를 인정하고 디버거에서 사용되어질 때 작동한다. 작업제 어는 사용 불가능 이다.(u) 13. -s 명령입력을 표준입력으로 부터 가져온다. 14. -t 한 줄을 읽고 실행한다. '\'가 라인의 끝에 있으면 새로운 라인으로 가기 위해 사용하고 다 음 라인으로 가서 계속한다. 15. -v verbose 쉘 변수를 설정한다. 그래서 명령입력이 히스토리에 치환된후 출 력한다. 16. -x echo 쉘 변수를 설정한다. 그래서 명령들은 실행전에 즉시 출력된다. 17. -V ~/.tcshrc가 실행되기전에 verbose 쉘 변수를 설정한다. 18. -X ~/.tcshrc가 실행되기전에 echo 쉘 변수를 설정한다. 플래그 인자들의 처리후에 -c, -i, -s, -t 옵션들 중 어느 것도 주어지지 않았 지만 인자들은 남아있다면 첫 인자는 명령들의 파일이름 또는 실행되는 스크 립트로 주어진다. 쉘은 이 파일 을 열고 $0로 재치환을 가능하게 하기위해 그 것의 이름을 저장한다. 많은 시스템들은 이 쉘과 호환되지 않는 쉘 스크립트를 가진 표준버전 6 또 는 7 쉘들을 사용 한다. 쉘은 # 가 아닌 첫 문자를 가진 스크립트를 실행하기 위해 표준 쉘과 같이 사용한다. 즉, 주석으로 시작하지 않는다. 나머지 인자들 은 argv 쉘 변수로 대치된다. V. 쉘 시작과 정지(Startup and shutdown) 로그인 쉘은 시스템 파일들인 /etc/csh.cshrc 와 /etc/csh.login 로 부터 명령 을 실행함으로서 시작한다. 이어서 사용자 홈 디렉토리에 있는 파일들로 부터 명령들을 실행한다. 처음으로 ~/.tcshrc를 실행하는데, ~/.tcshrc가 없다면 ~/.cshrc를 실행한다. 이 어서 ~/.history 또는 histfile 쉘 변수값에 있는 히스토리 파일을 실행한다. 그런 다음에 ~/.login을 실행하고 마지막으로 ~/.cshdirs 또는 dirsfile 쉘 변수값에 있는 디렉토리 스택 파일을 실행한다. /etc/csh.cshrc 읽기 전에 /etc/csh.login 를 읽고 ~/tcshrc 또는 ~/.csshrc 를 읽기 전에 ~/.login 를 읽고 그 뒤에 ~/.history 를 읽도록 쉘이 컴파일되어 있을 수도 있다. 로그인 쉘이 아닌 경 우에는 시작시에 단지 /etc/csh.cshrc 와 ~/.tcshrc 또는 ~/.cshrc 만 읽는다. 로그인 시에만 실행할 필요가 있는 stty 와 tset 같은 명령들은 대개 소유자 의 ~/.login 파일에 서 실행한다. csh 와 tcsh 둘다 같은 설정 파일들을 사용할 필요가 있는 사용자들은 tcsh 의 특별한 명령들 을 사용하기전에 tcsh 쉘 변수의 존재를 점검하는 단지 한 개의 ~/.cshrc 를 가질수 있다. 또는, ~/.cshrc 와 ~/.cshrc 에 기초한 ~/.tcshrc 둘다 가질 수 있다. 이 매뉴얼 에서는 ~/.tcshrc 는 ~/.tcshrc 를 의미하고, ~/.tcshrc 가 없다면 ~/.cshrc 를 의미한다. 일반적인 경우, 쉘은 터미널로 부터 명령들을 읽어서 시작하고 '>'를 프롬프 트로 사용한다. 인 자들의 처리와 명령 스크립트를 포함하고 있는 파일들을 수 행하기 위한 쉘 사용은 뒤에 설명 할 것이다. 쉘은 명령 입력 라인을 반복적으로 읽고 단어들로 그것을 구별하고 명령 히 스토리 목록에 그 것을 쓰고 명령을 해석하고 라인에 있는 각 명령들을 실행 한다. 빈 줄에서 '^D'를 타이핑하거나 logout, login 또는 쉘의 자동 로그아웃 방법 을 통해서 로그아 웃할 수 있다. 로그인 쉘을 종료할 때 logout 쉘 변수를 적 당하게 normal 이나 automatic 으 로 설정하면 /etc/csh.logout 또는 ~/.logout 파일로 부터 명령들을 실행한다. 쉘이 로그아웃중 에 DTR을 보내도록 컴파일되 어 있을 수도 있다. 시스템 로그인과 로그아웃 파일이름은 다르게 변하는 csh 과의 호환때문에 시스템마다 다르 다. 아래 FILES 부분을 참고해라. VI. 편집(Editing) 처음은 명령라인 편집기에대해 설명한다. 단어 완성과 목록화 그리고 철자 정정 부분들은 두 가지 기능을 설명한다. 하나는 편집기 명령들을 다루고 또 한가지는 자체 명령들을 다루게 될 것이다. 마지막으로 편집명령들을 목록화하 고 쉘과 자체 내장 바인딩에서 특수한 편집 명령들 을 설명한다. 1. 명령라인 편집(The command-line editor) (+) 명령라인 입력은 GNU emacs 와 vi를 사용하는 것과 같이 많은 키 시퀀 스를 사용하여 편 집할 수 있다. 편집은 edit 쉘 변수가 설정되었을때만 작 동한다. 그것은 상호작용하는 쉘들 에 있는 내정값으로 되어 있다. bindkey 내장 명령은 키 바인딩을 출력하거나 변경할 수 있다. 만약 쉘이 다른 것 으로 컴파일되지 않았다면 Emacs 키바인딩이 기본값이다. 그러나 vi 키바인 딩으로 변경할 수 있다. 쉘은 ↓(다음 히스토리),↑(앞 히스토리), →(뒷 문자), ←(앞 문자)와 같이 화살표 키들을 바인드되어 있다. 동작하지 않으면 다른 한 문자 바인딩으로 바꿀 수 있다. 바인딩 키는 TERMCAP 환경변수에서 정의할 수 있다. 이 러한 바인딩을 금지하기 위해서 settc 로 화 살표 키에 빈 문자열로 설정할 수 있다. ANSI/VT100 시퀀스는 항상 화살표키로 바인딩되 어 있다. 대부분 의 경우, 다른 키 바인딩은 Emacs 와 vi 사용자들은 쉽게 바인드 키를 알 수 있을 것이므로 여기에 그 목록을 나열하지 않는다. 마찬가지로 바인드키 는 각각의 짧은 기술로 편집명령들을 목록화할 수 있다. 편집명령들은 쉘을 동작하는 것과 같이 단어와 같은 개념이 아니다는 것 에 주의해라. 편집 기는 쉘 변수 단어에 없는 비(非)알파벳 문자로 단어들을 제한한다. 쉘은 단지 공백과 특 별한 의미를 지닌 문자들로 인식한다. 2. 단어 완성 기능과 단어 목록화 기능(Completion and listing) (+) 쉘은 특정한 약자로된 단어들을 완성할 수 있다. 단어의 일부를 타이프하 고 단어완성 편집 명령을 실행하기위해 탭키를 눌러라. 예를들어, 'ls /usr/lost' 와 같이 타이프하고 탭키를 누르면, 쉘은 입력버퍼 에 있는 완성되 지 않은 파일이름 /usr/lost 를 완성된 단어 /usr/lost+found/ 로 대체할 것이다. 여기서 마지막 '/'에 주의해라. 단어 완성 기능은 타이핑을 빠르게 하고 시각적인 지시자를 제공하기 위해서 완성된 디렉토리 끝에는 '/' 와 다른 완 전한 단어의 끝에는 공백을 추가한 다. addsuffix 쉘 변수로 이것을 금지하 도록 설정하지 않을 수도 있다. 일치되는 단어나 디렉토리가 없다면 경고음을 울릴 것이다. 단어가 이미 완성되었거나 /usr/lost 가 있거나 생각보다 많은 일치가 있 으면, 전체 단어를 타이핑해야하거나 거기에 없다면 쉘은 '/' 또는 공백을 끝에 추가할 것이다. 단어 완성 기능은 라인의 끝이 아닌 라인의 어디에서든 작동한다. 완성된 텍스트는 라인의 나머지를 오른쪽으로 밀어낸다. 단어의 중간에서 단어 완 성 기능은 지워질 필요가 있는 나 머지 문자들을 커서의 오른쪽으로 보낸다. 명령들과 변수들도 같은 방법으로 완성할 수 있다. 예를들어, 'em[tab]'을 타이핑하면 현재 'em' 으로 시작하는 단어가 'emacs' 밖에 없다면 'em' 을 'emacs' 로 완성되게 될 것이다. 완성기능은 패스에 있는 어떤 디렉토리나 주어진 전체 경로에서 명령을 찾을 수 있다. 'echo $ar[tab]' 이라고 타이핑하면 'ar' 로 시작되는 다른 변수가 없다면 '$ar' 를 '$argv' 로 완성할 것이다. 쉘은 네가 완성하기를 원하는 단어를 결정하기 위해 입력버퍼를 해석하여 파일이름, 명령 또는 변수로서 완성한다. 버퍼에 있는 첫 번째 단어가 ;, |, &, &&, || 로 시작되는 단어이 면 명령으로서 간주한다. $ 로 시작하는 단어 이면 변수로 간주한다. 그 외는 파일이름으 로 간주한다. 빈 줄은 파일이름으 로서 완성된다. ^D 를 타이핑하여 delete-char-or-list-or-eof 편집기 명령을 실행해서 가 능한 단어 완성을 출력할 수 있다. 쉘은 'ls -F' 를 사용해서 가능한 단어 완성을 출력한다. 그리고 프롬프트 와 미완성된 명령라인을 보여준다. 예를 들어, > ls /usr/l[^D] lbin/ lib/ local/ lost+found/ > ls /usr/l 위와 같이 된다. autolist 쉘 변수가 설정되어 있다면, 단어 완성이 실패했을 때 쉘은 남아 있는 선택들을 출력한다. > set autolist > nm /usr/lib/libt[tab] libtermcap.a@ libtermlib.a@ > nm /usr/lib/libterm autolist 가 'ambiguous' 로 설정되어 있으면, 선택들은 단지 완성이 실패 했을때만이 출력되 고 완성되는 단어에 새로운 문자를 첨가하지 않는다. 완성된 파일이름은 변수들을 포함할 수 있고 '~' 와 같이 생략된 자신이나 다른 사람의 홈 디렉토리들과 '=' 로 생략된 디렉토리 스택 엔트리들도 포함 한다. 예를들어, > ls ~k[^D] kahn kas kellogg > ls ~ke[tab] > ls ~kellogg/ 또는 > set local = /usr/local > ls $lo[tab] > ls $local/[^D] bin/ etc/ lib/ man/ src/ > ls $local/ 변수들은 확장 변수 편집기 명령으로 정확히 확장되는 것에 주의해라. delete-char-or-list-or-eof 는 단지 라인의 끝을 출력한다. 라인의 중간에 서는 커서뒤에 있 는 문자는 삭제한다. 그리고 빈 줄은 빠져나가거나 ignoreeof 가 설정되어 있으면 아무것도 하지 않는다. 편집기 명령 목록 선택을 바인드하는 'M-^D' 는 라인의 어디에서든 완성 가능성을 출력하 고 목록 선택 또는 지우거나 지우지 않는 연관된 편집기 명 령들의 어떤 것은 출력하고 빠 져나가고 delete-char-or-list-or-eof 에서 출력 하는 어느 것은 bindkey 내부 명령으로 '^D' 로 바인드되어질 수 있다. 기본값으로 어느 키로 바인드되어 있지 않는 complete-word-fwd 와 complete-word-back 편집기 명령들은 목록에서 다음 또는 이전 단어로 현 재 단어를 대치하는 가능한 완성들의 목록을 아래 또는 위로 순환하도록 한다. fignore 쉘변수는 완성에서 무시되도록 접미사 목 록을 설정할 수 있 다. 예를 들어, > ls Makefile condiments.h~ main.o side.c README main.c meal side.o condiments.h main.c~ > set fignore = (.o \~) > emacs ma[^D] main.c main.c~ main.o > emacs ma[tab] > emacs main.c 'main.c~' 와 'main.o' 는 fignore 에서 설정된 접미사로 끝나기 때문에 완 성에서 무시된다. '\'가 파일이름 치환에서 설명한 홈으로 확장되는 것을 막기위해 '~' 앞에 필요하다는 것에 주의하라. fignore 는 단지 한 개의 완성만 가능하다면 무시된다. complete 쉘 변수가 'enhance' 로 설정되어 있다면 완성은 대소문자를 무 시하고 '.', '-' 과 '' 를 단어 분리자로 생각하고 하이픈(-)과 밑줄(_)은 같 은 것으로 인식한다. 예를 들어, 현재 목록이 아래와 같다면 comp.lang.c comp.lang.perl comp.std.c++ comp.lang.c++ comp.std.c 'mail -f c.l.c[TAB]' 라고 타이핑했다면 'mail -f comp.lang.c' 로 완성되 어지고 ^D 는 comp.lang.c 와 comp.lang.c++ 을 출력할 것이다. 'mail -f c..c++[^D]' 는 'comp.lang.c++' 과 'comp.std.c++' 을 출력할 것이다. 'rm a--file[^D]' 라고 타이핑하면 대소문자가 무시되 고 하이픈(-)과 밑줄(_)이 같은 의미를 나타내기 때문에 Asillyfile, a-hyphenated-file 그리 고 anothersillyfile 과 같이 세 파일 모두 출력된다. 그러나 마침표(.)는 하이픈(-)과 밑줄 (_)과 동등하게 취급하지 않는다. 여러가지 다른 쉘 변수들이 완성과 목록화에 영향을 미치기도 한다. recexat 변수는 비록 긴 단어를 찾기위해 더 많은 타이핑을 해야하지만 가장 짧은 단어에 일치하여 완성되도록 설정할 수 있다. 예를들어, > ls fodder foo food foonly > set recexact > rm fo[tab] 'fo' 는 'fod' 또는 'foo' 로 확장될 수 있기 때문에 단지 경고음만 나온다. 그러나 다시 'o' 를 타이핑한다면 아래와 같이 된다. > rm foo[tab] > rm foo 완성기능은 'food' 와 'foonly' 도 일치되지만 가장 짧은 단어인 'foo' 로 완 성된다. autoexpand 변수는 완성되기전에 확장 히스토리 편집기 명령을 실행하도 록 설정될 수 있 다. autoexec 쉘변수는 완성되기전에 완성될 단어의 철자를 정정한다. correct 쉘변수는 'return' 을 치면 자동적으로 명령을 완성한다. matchbeep 쉘변수는 여러 상황에서 경고음 을 내거나 내지 않게 할 수 있고 nobeep 는 결코 경고음을 내지 않는다. nostat 변수는 디 렉토리 목록이나 완 성 기능이 디렉토리 상태를 나타내는 것을 막기위해 디렉토리와 일치하 는 패턴을 설정한다. listmax 와 listmaxrows 쉘변수는 출력될 목록의 수와 열을 제한하기 위해 설정한다. reconizeonlyexecutables 변수는 단지 실행가능한 쉘 목록만을 출력하지만 속도가 매우 느리다. 마지막으로 complete 명령은 파일이름, 명령과 변수들이 어떻게 완성 되어질지를 쉘에게 알린다. 완성기능 과 목록화는 glob-pattern 에서는 작동하지 않는다. 그러나 list-glob 와 expand-glob 편집기 명령들은 glob-pattern 을 위해 같은 기능을 수행 한다. 3. 철자 정정 기능(Spelling correction) (+) 쉘은 또한, 단어 완성기능과 목록화 기능 뿐만 아니라 파일이름, 명령과 변수이름들의 철자 를 정정할 수 있다. 개별적인 단어들은 보통 M-s 와 M-S 로 바인드된 철자 편집기 명령 과 M-$ 로 바인드된 전체 입력라인의 철자를 정정할 수 있다. correct 쉘변수는 명령이름을 정정하기위해 'cmd' 로 설정하고 타이프한 전체 라인을 정정 하기 위해서는 'all' 로 설정하고 autocorrect 변수는 완성 하기전에 단어를 정정하기위해 설 정한다. 철자 정정은 이런 방법으로 실행되 고 명령 라인의 일부가 잘못된 철자로 생각되면 그것을 정정한 라인을 출 력한다. 예를들어, > set correct = cmd > lz /usr/bin CORRECT>ls /usr/bin (y|n|e|a)? 위와 같이 수정한 라인으로 대치할려면 'y' 또는 스페이스로 응답하고 입 력 버퍼에 수정되 지 않은 명령을 남겨두려면 'e' 로 응답하고 ^C 를 타이 프한 것처럼 명령을 취소할려면 'a' 를 타이프하고 원래 라인을 변경하지 않기위해서는 그 밖의 것을 타이프해라. 철자 수정은 사용자가 정의한 것을 인식한다. 철자 수정이 정의되어지는 위치에서 입력 단어가 수정 목록에 있는 단어 와 같다면 철자 수 정은 틀린 철자를 등록한 뒤에 수정된 단어를 출력한다. 그러나 입력 단어가 그 위치에서 가능한 완성과 일치되지 않는다면 철자 수 정은 틀린 철자를 등록하지 않는다. 단어 완성 기능과 마찬가지로 철자 수정 기능은 라인 어디에서나 작동하 고 라인의 나머지 는 오른쪽으로 밀어내고 커서의 오른쪽에 있는 문자들은 남겨놓는다. 철자 수정은 의도한 방법대로 작동하지 않을 수도 있고 대부분 경험에 의 해서 해야한다. 4. Editor commands (+) 편집 명령 'bindkey' 는 키 바인딩들을 출력하고 'bindkey -l' 도 역시 키바인딩을 출 력하고 주로 편집 기 명령들에 설명된 것과 같다. 여기서는 단지 새롭고 특 별하게 흥미로운 편집기 명령들을 기술한다. 편집기의 키바인딩의 종류들 은 emacs 나 vi 를 보아라. 각 명령은 기본값으로 바인드된 문자 또는 문자들은 괄호안에 주어져 있 다. '^chaeacter' 는 제어문자를 의미하고 'M-character' 는 메타키가 없는 터 미널에서 이스케이 프 문자를 타이프할 수 있다. 기본값으로 문자들을 바인드한 명령들은 편의상 소문자와 대문자, 모두를 바인드한다. ① complete-word (TAB) 완성 기능과 목록 기능에 기술된 단어들을 완성한다. ② complete-word-back (연결 없음) complete-word-fwd 처럼 목록의 끝으로 부터 한단계씩 올라온다. ③ complete-word-fwd (연결 없음) 가능한 완성 목록에 있는 현재 단어를 첫 번째 단어로 대치한다. 목록 에서 한단계씩 밑 으로 내려간다. 목록의 끝에서는 경고음을 내고 완성 되지 않은 단어로 복귀한다. ④ complete-word-raw (^X-tab) complet-word 와 같이 사용자가 정의한 완성은 무시한다. ⑤ copy-prev-word (M-^) 현재 라인에서 현재 단어를 입력 버퍼에 복사한다. insert-last-word 를 보아라. ⑥ dabbrev-expand (M-/) 필요하다면 히스토리 목록 주위를 싸고 있거나 선행하는 서브 스트링 인 가장 최근에 수행한 것으로 현재 단어를 확장한다. 간섭하는 타이핑없 이 dabbrev-expand 를 반복하 여 다음을 이전 단어로 바꾼다. history-search-backward 와 같이 동일한 일치를 건너 뛴다. ⑦ delete-char (연결 없음) 커서 아래에 있는 문자를 지운다. delete-char-or-list-or-eof 를 참고 해라. ⑧ delete-char-or-eof (연결 없음) 커서 아래에 문자가 있다면 delete-char 를 실행하고 빈 라인이면 end-of-file 를 실행 한다. delete-char-or-list-or-eof 를 참고해라. ⑨ delete-char-or-list (연결 없음) 커서 아래에 문자가 있다면 delete-char 를 실행하고 라인의 끝이면 list-choices 를 실 행한다. delete-char-or-list-or-eof 를 참고해라. ⑩ delete-char-or-list-or-eof (^D) 커서 아래에 문자가 있다면 delete-char 를 실행하고 라인의 끝이면 list-choices 를 실 행하고 빈 라인이면 end-of-file 를 실행한다. down-history (down-arrow, ^N) up-history 와 같으나, 한 단계씩 아래로 내려간다. 원래 입력 라인에 서 멈춘다. end-of-file (연결 없음) 파일의 끝을 나타내는 신호이다. ignoreeof 쉘 변수가 이것을 금지하게 설정되지 않았다 면 쉘을 종료한다. delete-char-or-list-or-eof 를 참고해 라. expand-history (M-space) 현재 단어에 히스토리 치환을 확장한다. 히스토리 치환을 참고해라. magic-space, toggle-literal-history 그리고 autoexpand 쉘 변수를 참 고해라. expand-glob (^X-*) 커서 왼쪽을 glob-pattern 으로 확장한다. 파일이름 치환을 참고해라. expand-line (연결 없음) expand-history 와 같이나, 입력버퍼에 있는 각 단어에 히스토리 치환 을 확장한다. expand-variables (^X-$) 변수를 커서 왼쪽으로 확장한다. 변수 치환을 참고해라. history-search-backward (M-p, M-P) 커서까지 입력 버퍼의 현재 내용으로 시작하는 명령을 히스토리 목록 에서 역방향으로 찾고 입력버퍼로 복사한다. 찾기 문자열은 `*', `?', `[]' 또는 `{}' 를 포함하는 glob-pattern 이어도 된다. up-history 와 down-history 는 히스토리 목록에 있는 적절 한 점에서 수행된다. 단지, emacs 모드일 때만 가능하다. history-search-forward 그리 고 i-search-back 를 참고해라. history-search-forward (M-n, M-N) history-search-backward 와 같으나 순방향으로 찾는다. i-search-back (연결 없음) history-search-backward 와 같이 역방향으로 찾는다. 패턴의 끝에 위 치한 입력버퍼에 처음으로 일치한 것을 복사한다. 처음으로 일치한 곳 에서 'bck: ' 을 출력한다. 찾기를 확장하기위해 문자를 첨가할 수 있다. i-search-back 은 같은 패턴으로 찾기를 계속한 다. 필요하다면 히스토 리 목록을 덮어씌운다. i-search-back 이 작동하기위해서는 한 문 자를 바인드하거나 아래의 특별한 문자중 하나를 타이프해야한다. ^W : 찾기 패턴에 커서 아래 단어의 나머지를 첨가한다. 삭제하거 나 어떤 문자를 backward-delete-char 를 연결한다. 마지막에 타 이프한 문자의 영향을 취소한다. 적당하다면 찾기 패턴에서 문자 들을 삭제한다. ^G : 이전 찾기가 성공했다면 찾기 전부를 취소한다. 그렇지 않다 면 마지막으로 성 공한 찾기로 되돌아 간다. escape : 입력버퍼에 있는 현재 라인을 남겨두고 찾기를 끝낸다. self-insert-command 에 바인드되지 않은 다른 문자는 입력버퍼에 현 재 라인을 남겨두 고 찾기를 끝낸다. 그리고나서 정상적인 입력으로 해 석한다. 예외적으로, 캐리지 리턴은 현재 라인을 실행한다. 단지, emacs 모드에서만 사용가능하다. i-search-fwd 와 history-search-backward 를 참고해라. i-search-fwd (연결 없음) i-search-back 와 같으나 순방향으로 찾는다. insert-last-word (M-) 입력버퍼에 이전 입력라인(!$)의 마지막 단어를 삽입한다. copy-prev-word를 참고해라. list-choices (M-^D) 완성기능과 목록기능에서 설명한 완성 가능성들을 출력한다. delete-char-or-list-or-eof 와 list-choices-raw 를 참고해라. list-choices-raw (^X-^D) list-choices 와 같으나 사용자가 정의한 완성기능을 무시한다. list-glob (^X-g, ^X-G) 커서의 왼쪽 glob-pattern 과 일치하는 목록을 'ls -F' 와 같이 출력한 다. list-or-eof (연결 없음) 빈 라인이면 list-choices 또는 end-of-file 을 실행한다. delete-char-or-list-or-eof 를 참고해라. magic-space (연결 없음) expand-history 와 같이 현재 라인에 히스토리 치환을 확장하고 공백 을 추가한다. magic-space 는 스페이스바에 연결되어 있으나 기본 값으로는 연결되어 있지 않다. normalize-command (^X-?) PATH 에 있는 경로에서 현재 단어를 찾아서 있다면, 전체 경로로 대 치한다. 특수 문 자들도 인정된다. 별명들도 확장하지만 별명들에 있는 명 령들은 확장되지 않는다. 이 명령은 'dbx' 나 'sh -x' 와 같이 인자를 가지는 명령들도 사용할 수 있다. normalize-path (^X-n, ^X-N) symlinks 쉘 변수가 'expand' 로 설정되어 있으면 현재 단어를 확장한 다. overwrite-mode (unbound) 삽입 모드와 수정 모드사이를 토글한다. run-fg-editor (M-^Z) 현재 입력 라인을 저장하고 EDITOR 또는 VISUAL 환경변수 파일이 름의 마지막 성분 과 같은 이름을 가진 정지된 작업을 찾는다. EDITOR 또는 VISUAL 환경변수, 설정되 어 있지 않으면 'ed' 나 'vi' 이다. 그런 작업이 있다면 마치 'fg %job' 과 같이 재 실행 된다. 이것은 편집기와 쉘 사이를 쉽게 백그라운드와 포그라운드로 토글할 때 유용하 다. 이 명령은 '^Z' 에 연결되어 있어서 쉽게 할 수 있다. run-help (M-h, M-H) 완성 루틴에서 처럼 'current command' 와 같은 개념을 사용하여 명 령에 대한 문서를 찾아 그것을 출력한다. run-help 는 pager 를 사용하 지 않고 짧은 도움말을 출력한다. 문서는 command.help, command.1, command.6, command.8 또는 command 로 불리우 는 파일이 있어야 하고 HPATH 환경변수에 기술된 디렉토리들 중에 하나에 있어야 한 다. 한 개 이상의 도움말 파일이 있 다면 단지 처음 것만 출력한다. self-insert-command (text characters) 삽입모드가 기본값이며, 삽입 모드에서는 커서 아래에 있는 문자뒤에 타이프한 문자를 삽입한다. 수정 모드에서는 커서 아래에 있는 문자를 타이프한 문자로 대치한다. 일반적으로 입력 모드는 라인들사이를 보호하나 각 라인의 처음부터 편집기를 삽입 또 는 수정 모드로 할려면 inputmode 쉘변수를 'insert' 또는 'overwrite' 로 설정할 수 있 다. overwrite-mode 를 참고해라. sequence-lead-in (arrow prefix, meta prefix, ^X) 다음 문자들이 다중키열의 한 부분이다는 것을 가리킨다. 실제로 명령 을 다중키열로 연 결하면 두가지 연결을 만들어내는 것과 같다. sequence-lead-in 에서는 첫 문자와 명령 에서는 전체 열이다. sequence-lead-in 에 연결된 문자로 시작하는 모든 열은 또 다른 명령 이 연결되어 있지 않다면 정의하지 않은 키로 연결된다. spell-line (M-$) spell-word 와 같이 입력라인에 있는 각 단어의 철자를 수정한다. 그 러나 `!', `.', `\', `^', `-', `*' 또는 `%' 로 시작하는 문자인 경우는 스위치, 치환 등과 같은 문제를 피 하기위해 무시한다. 철자 수정을 참 고해라. spell-word (M-s, M-S) 철자 수정에 기술한 것처럼 현재 단어의 철자를 수정한다. 단어의 각 부분을 검사한다. toggle-literal-history (M-r, M-R) 입력 버퍼에 있는 히스토리 치환을 확장 또는 비확장한다. expand-history 와 autoexpand 쉘 변수를 참고해라. undefined-key 경고음을 낸다. up-history (up-arrow, ^P) 히스토리 목록에 있는 전(前) 엔트리를 입력버퍼에 복사한다. histlit 이 설정되어 있다 면 엔트리 문자 그대로를 사용한다. 히스토리 목록을 한 단계씩 위로 반복하여서 맨 처 음에서 멈춘다. vi-search-back (?) history-search-backward 와 같이 문자열을 찾기 위해 '?' 를 출력한 다. 그것을 찾아서 입력버퍼에 복사한다. 찾는 것이 없으면 경고음을 낸 다. 리턴을 치면 찾기를 끝내고 입 력버퍼에 마지막으로 찾은 것을 남 겨 놓는다. ESC 를 누르면 찾기를 끝내고 찾은 것을 실행한다. 이것은 단지 vi 모드에서만 사용할 수 있다. vi-search-fwd (/) vi-search-back 에서와 같으나 순(順)방향으로 찾는다. which-command (M-?) 입력버퍼에 있는 첫 단어중 어느 것을 실행한다. builtin 명령을 참고 해라. VII. 사전 구조(Lexical structure) 쉘은 공백과 탭으로 입력라인의 단어를 분리한다. '&', '|', ';', '<', '>', '(', ')' 와 '&&', '||', '<<', '>>' 와 같은 특수 문자는 공백 으로 둘러 쌓여 있 든지 없든지 항상 단어들을 분리한다. 쉘 입력이 터미널이 아니면 '#' 문자는 주석을 시작하는 것이다. '#' 와 입력라 인의 나머지는 앞으로 실행하는 것을 취소한다. 공백과 탭을 포함한 특수 문자는 역슬래쉬(\), 따옴표('), 이중 따옴표("), 역따 옴표(') 가 앞에 오면 그것의 특별한 의미를 막고 다른 단어의 일부로 인식한다. 그러나, 새로운 라인을 나타내 는 역슬래쉬(\)는 공백과 동일하게 취급하고 단지 새로운 라인을 나타내는 시퀀스로 취급한다. 히스토리 치환을 제외한 모든 치 환은 따옴표(')나 변수 치환과 명령 치환에서 중요한 문자($ 와 역따옴표('))를 역슬래쉬(\)로 문자열을 에워싸는 것을 금지한다. 히스토리 치환은 따옴표(') 가 아닌 역슬래쉬(\)로 문자열을 에워싼다. 변수 치환과 명령 치환에서는 이중 따옴표(")나 역따옴표(')로 문자열을 인용 하나 다른 치환에 서는 금지한다. 따옴표(')나 이중따옴표(") 안의 텍스트는 하 나의 단어로 취급한다. 공백과 탭 을 포함하는 이런 문자열에서 메타문자는 분리 자가 아니다. 단지 특별한 경우(명령 치환)에서 만 이중따옴표(")는 하나이상의 단어로 취급하나 따옴표(')는 결코 그렇지 않다. 그리고 역따옴 표(')는 명령 치 환과 같은 특별한 경우에는 하나이상의 단어로 취급한다. 복잡하게 인용하는 문자 자체를 포함하는 문자열은 혼란스러울 것이다. 이런 인용은 사람이 하는 것과 같이 사용하지 않는다는 것을 기억해라. 문자열 전부 나 인용할 필요가 있는 문자열 의 부분들을 적절하게 다른 종류의 인용부호를 사 용해서 더 쉽게 인용할 수 있다. backslashquote 쉘변수를 이용하여 백슬래쉬(\)가 항상 '\', ''', '"'를 인용하도 록 할 수 있다. 이 것은 복잡한 인용 작업을 더 쉽게 만들 것이다. 그러나 이것 은 csh 에서는 구문 에러가 난다. VIII. 치환(Substitutions) 쉘이 발생하는 순서대로 입력을 수행하는 여러 가지 변환들을 설명한다. 이 것을 끝내면 우리 는 데이터가 포함되는 구조와 그것에 영향을 주는 명령들과 변수들을 알게 된다. 치환들은 아 래 Lexical structure 에 설명한 인용에 의해서 금지된다는 것을 기억해라. 1. 히스토리 치환(History substitution) 터미널로 부터 입력하는 각 명령 또는 이벤트는 히스토리 목록에 저장된 다. 전(前) 명령은 항상 저장되고 많은 명령들을 저장하기위한 숫자를 history 쉘변수로 설정할 수 있다. histdup 쉘변수는 이중의 이벤트나 연속하는 이벤트를 저장하지 않도록 하기 위해서 설정 할 수 있다. 저장된 명령들은 1 에서부터 연속적으로 번 호가 매겨져 있고 시간이 붙여져 있다. 일반적으로 이벤트 번호를 사용할 수 있고 현재 이벤트 번호는 prompt 쉘변수에 '!' 를 추 가해서 프롬프트에 나타낼 수 있다. 실제적으로 쉘은 확 장된 형식이나 문자 그대로를 히스 토리에 저장한다. histlit 쉘변수가 설정 되어 있으면 히스토리에서 출력하거나 히스토리에 저장할 명령은 문자 그 대로 사용된다. history 내부명령은 출력하거나 파일에 저장하고 복구하고 어느때에 히스 토리 목록을 깨끗 이 비울 수 있고 savehist 와 histfile 쉘변수는 로그아웃 할 때 자동적으로 히스토리 목록을 저장하고 로그인시에 복구할 수 있다. 히스토리 치환은 반복되는 명령을 쉽게 만들고 현재 명령에 이전 명령의 인수를 반복하고 적은 타이핑으로 이전 명령에서 실수한 철자를 정정하고 고도의 편리함을 주기 위해서 히 스토리 목록으로 부터 입력라인을 꺼낸다. 히스토리 치환은 입력라인의 어디에서나 '!' 로 시작할 수 있으나 타이핑 한 현재 라인을 보 존하지는 않는다. '!' 는 특별한 의미를 막기위해 '\' 보다 앞에 올 수 있다. '!' 는 뒤에 공백 이나 탭, newline 또는 '=' 그리고 '(' 가 온 다면 변경되지 않고 지나간다. 히스토리 치환은 또한 입력라인이 '^' 로 시작될때에 발생한다. 이런 특수 한 생략은 뒤에 다루기로 하겠다. '!', '^' 와 같이 히스토리 치환 신호로 사용 되는 문자들은 histchars 쉘변 수로 설정하여 변경할 수 있다. 히스토리 치환을 포함하는 입력라인은 실행되기 전에 출력된다. 히스토리 치환은 선택된 이벤트로 부터 특정한 단어들을 선택하는 'word designator' 와 선택된 단어들을 조정하는 'modifier' 와 같은 단어로 이벤트를 지정하는 이벤트 명세를 할 수 있다. ※ 이벤트 명세(event specification) ① n : 특별한 이벤트를 참조하기 위한 번호. ② -n : 현재 이벤트 이전 n 번째 이벤트를 지정하는 옵셋. ③ # : 현재 이벤트. 이것은 반복을 검사하지 않는 csh 에서는 주의깊 게 사용해야 한다. tcsh 는 10 번 반복을 허용한다. ④ ! : 바로 이전 이벤트. '-1' 과 같다. ⑤ s : 문자 s 로 시작되는 첫 단어를 가진 가장 최근의 이벤트. ⑥ ?s? : 문자열 s 를 포함하는 가장 최근의 이벤트. 즉시 newline 이 따라 온다면 두 번째 '?' 는 생략할 수 있다. 예를 들어, 어느 히스토리 목록이 다음과 같다면, 9 8:30 nroff -man wumpus.man 10 8:31 cp wumpus.man wumpus.man.old 11 8:36 vi wumpus.man 12 8:37 diff wumpus.man.old wumpus.man 이것은 이벤트 번호와 시간을 보여주고 있다. 우리가 아직 타이프하지 않 은 현재 이벤트는 13 이다. '!11' 과 '-2' 는 11 번 이벤트를 참조한다. '!!' 는 바로 이전 이벤트인 12 번 이벤 트이다. '!!' 는 뒤에 ':' 이 오면 '!' 하나 를 생략할 수 있다. '!n' 은 'n' 으로 시작하는 명령인 9번 이벤트를 참조한 다. '!?old?' 는 'old' 를 포함하고 있는 12 번 이벤트를 참조한다. word designators 또는 modifiers 가 없으면 히스토리 참조는 간단하게 전체 이벤트로 확 장된다. 그러므로 복사 명령을 재 실행하기 위해서는 '!cp' 라고 타이프해야 하고 'diff' 의 출력이 화면의 처음에서 스크롤이 멈추 게 하려면 '!!|more' 라고 타이프해야 한다. 히스토리 참조는 필요하다면 {} 로 텍스트를 둘러쌓아서 분리할 수 있다. 예를 들어, '!vdoc' 는 'vdoc' 로 시작되는 명령을 찾을 것이나 이 예에서 는 하나도 찾지 못 한다. 그러나 '!{v}doc' 는 애매하지만 'vi wumpus.mandoc' 로 확장할 것이다. {} 에서는 히 스토리 치환을 저장하지 않는다. 또한, '!3d' 는 csh 에서는 3 번 이벤트에 문자 'd' 를 추가하고 tcsh 에서 는 '3d' 로 시작하 는 마지막 이벤트로 확장한다. 그러므로 tcsh 에서는 단 지 숫자 인수만이 완벽하게 이벤트 번호로 취급된다. 이것은 숫자로 시작하 는 이벤트를 재호출하는 것이 가능하게 한다. csh 에서 이와 같이 할려면 '!\3d' 라고 해야 한다. 이벤트로 부터 단어를 선택하기 위해서는 ':' 그리고 원하는 단어들을 지 정하는 이벤트 명 세를 따른다. 입력라인의 단어들은 0 부터 숫자화되므로 첫 번째 단어(대개의 경우, 명령어 이다.)는 0 이고 두 번째 단어(대부분 인수이다.)는 1 이다. ※ 기본 단어 지정자. ① 0 : 첫 번째 단어. ② n : n 번째 인수. ③ ^ : 첫 번째 인수. '1' 과 같다. ④ $ : 마지막 인수. ⑤ % : ?s? 로 찾아서 일치하는 단어. ⑥ x-y : 단어들의 범위. ⑦ -y : '0-y' 과 동일하다. ⑧ * : '^-$' 와 같으나 이벤트가 단지 한 단어만 포함한다면 아무것도 리턴하지 않는 다. ⑨ x* : 'x-$' 와 같다. ⑩ x- : 'x*' 와 같으나 마지막 단어를 생략한다('$'). 선택된 단어들은 하나의 공백으로 분리된 명령라인에 삽입한다. 예를들어, 이전 예에서 'diff' 명령은 이전 이벤트로 부터 첫 번째 인수를 선택하기 위해서 ':1' 을 사용하여 'diff !!:1.old !!:1' 나 'diff !-2:2 !-2:1' 와 같이 타이핑한다. 그리고 'cp' 명 령으로 부터 인수들을 교환한다. 'diff' 의 순서를 생각하지 않는다면 'diff !-2:1-2' 나 간단하게 'diff !-2:*' 라고 타이핑한다. 'cp' 명령은 현재 이벤트를 참조하기 위해서 '#' 를 사용하여 'cp wumpus.man !#:1.old' 라 고 타이핑한다. '!n:- hurkle.man' 는 'nroff' 명령으 로 부터 첫 두단어들은 재사용되어 'nroff -man hurkle.man' 와 같이 된 다. 단어 지정자로 부터 이벤트 명세를 분리하는 ':' 은 인수 선택자가 '^', '$', '*', '%', '-' 로 시작한다면 생략할 수 있다. 예를들어, 'diff' 명령은 'diff !!^.old !!^' 와 'diff !!$.old !!$' 는 같다. 그러 나 '!!' 는 '!' 를 생 략한다면 '-' 로 시작하는 인수 선택자는 이벤트 명세로 서 해석될 것이다. 히스토리 참조는 이벤트 명세가 없다면 단어 지정자를 가질 수 있다. 그래서 이전 명령을 참조한다. 계속해 서 'diff' 명령 예에서 간단하게 'diff !^.old !^' 라고 할 수 있고 반대 순서에서 인수들을 얻 기 위 해 단지 'diff !*' 라고 한다. 히스토리 참조에서 단어들은 편집할 수 있고 ':' 뒤에 하나 또는 더 많은 수정자를 사용하 여 수정될 수 있다. ※ 수정자. ① h : 경로 이름 구성요소중 마지막을 제거하고 처음부분만 남겨 놓 는다. ② t : 경로 이름 구성요소중 처음부분 모두를 제거하고 마지막은 제 거한다. ③ r : 파일 확장자 '.xxx' 를 제거하고 파일 이름만 남겨 놓는다. ④ e : 확장자를 제외한 모두를 제거한다. ⑤ u : 첫 번째 소문자를 대문자로 변경한다. ⑥ l : 첫 번째 대문자를 소문자로 변경한다. ⑦ s/l/r/ r 을 l 로 치환한다. l 은 ed 명령에서와 같이 표준 식이 아닌 r 과 같은 간단한 문 자열이다. '/' 대신에 다른 구분기호 문자를 사용할 수 있다. '\' 는 l 과 r 사이에 구 분기호를 인용할 수 있다. r 에서 '&' 문 자는 l 로 대치한다. '\' 는 또한 '&' 를 인용 한다. l 이 빈 공간('')이라 면 이전 치환으로 부터 l 또는 이전 '?s?' 이벤트 명세로 부터 s 는 사 용될 수 있다. 뒤에 newline 이 오면 구분기호는 생략할 수 있다. ⑧ & : 이전 치환을 반복한다. ⑨ g : 각 단어에 한 번만 다음 수정자를 적용한다. ⑩ a (+) : 단일 단어가 가능한 만큼 더 많이 아래 수정자를 적용한다. 'a' 와 'g' 는 전체적으로 수정자를 적용하기 위해 함께 사용할 수 있다. 'a' 와 's' 수 정자를 함께 사용하는 현재 수행에서는 무한 루프 에 빠질 수 있다. 예를들어, ':as/f/ff/' 는 결코 종료되지 않을 것이다. 이런 동작은 다음 버전에서는 변경될 수도 있다. p : 새로운 명령라인을 출력하지만 그것을 실행하지는 않는다. q : 다음 치환들을 금지하는 치환된 단어들을 인용한다. x : q 와 같으나 단어들에 공백, 탭, newline 이 있을 수 있다. 수정자들은 'g' 가 사용되지 않았다면 단지 처음 수정할 수 있는 단어에 적요된다. 수정될 단어가 없으면 에러를 낸다. 예를들어 'diff' 명령은 같은 라인('!#^')에 있는 첫 인수에서 '.old' 를 제거 하기 위해 ':r' 을 사용해서 'diff wumpus.man.old !#^:r' 로 타이프할 수 있다. 'echo hello out there' 와 같이 명령한 후에 'hello' 를 대문자로 바꾸기 위 해 'echo !*:u' 라 고 타이핑하고 'hello' 전체를 대문자로 바꾸기 위해서는 'echo !*:au' 로 타이핑하고 전부를 대문자로 할려면 'echo !*:agu' 라고 타 이핑하면 된다. 'mail -s "I forgot my password" rot' 와 같이 타이핑했을 때 'rot' 를 'root' 로 바꾸기위해 서는 '!:s/rot/root' 라고 하면 된다. 또한, 치환을 위한 특수한 생략이 있다. 입력라인에서 첫 문자일때는 '^' 는 '!:s^' 와 같은 의미이다. 그러므로 앞의 예에서 철자를 정정하기 위해 '^rot^root' 라고 할 수도 있다. 이것은 단지 정확히 '!' 로 시작하지 않는 히스토리 치환에서 사용할 수 있다. csh 에서는 단지 하나의 수정자만이 히스토리와 변수 확장에 적용할 수 있다. tcsh 에서는 하나 이상이 사용될 수 있다. 예를 들어, % mv wumpus.man /usr/man/man1/wumpus.1 % man !$:t:r man wumpus csh 에서는 'wumpus.1:r' 의 결과를 가져올 것이다. 콜론(:) 뒤의 치환은 {} 로 분리할 필요 가 있다. > mv a.out /usr/games/wumpus > setenv PATH !$:h:$PATH Bad ! modifier: $. > setenv PATH !{-2$:h}:$PATH setenv PATH /usr/games:/bin:/usr/bin:. 첫 번째는 csh 에서는 성공하나 tcsh 은 두 번째 콜론(:) 뒤에 '$' 보다는 다른 수정자를 기대하기 때문에 tcsh 에서는 실패한다. 결국, 히스토리는 편집뿐만 아니라 단지 기술된 치 환을 통해서 접근할 것이다. up-history 와 down-history, history-search-backward 와 history-search-forward, i-search-back 과 i-search-fwd, vi-search-back 과 vi-search-fwd, copy-prev-word 와 insert-last-word 편집명령들은 히스토리 목록에서 이벤트들을 찾고 입력버퍼에 그것들을 복 사한다. toggle-literal-history 편집명령은 입력버퍼에 히스토리 목록의 확장된 형 식과 문자 그대로 의 형식 사이를 전환한다. expand-history 와 expand-line 는 각각 현재 단어에서 히스토리 치환을 확장하고 전체 입 력버퍼에서 히스토리 치환을 확장하는 것이다. 2. 별명 치환(Alias substitution) alias 와 unalias 명령으로 설정하고 해제하고 출력할 수 있는 별명 목록 을 가지고 있다. 명 령라인이 단순 명령으로 해석된 후에 각 명령의 첫 단어 들은 왼쪽에서 오른쪽으로 별명을 가지고 있는지 알아보기 위해서 점검된 다. 그래서 있다면 첫 단어는 별명으로 대치된다. 별 명이 히스토리 를 참조 한다면 그것은 히스토리 치환을 받는다. 별명이 히스토리를 참조하 지 않는 다면 인수 목록은 접촉하지 않은채 그대로 둔다. 'ls' 의 별명이 'ls -l' 이다면 명령 'ls /usr' 은 'ls -l /usr' 으로 치환되어 실행되고 인수 목 록은 방해받지 않는다. 'lookup' 의 별명이 'grep !^ /etc/passwd' 이면 'lookup bill' 은 'grep bill /etc/passwd' 로 될 것이다. 별명들은 메타 구문 해석자로 사용할 수도 있다. 예를들어, 'alias print 'pr \!* | lpr'' 는 라인프린터의 인수로 pr 을 가지는 명령 print 를 정의한다. 별명 치환은 명령의 첫 단어가 별명이 없을때까지 계속 반복한다. 앞의 예에서 처럼 별명 치환이 첫 단어를 변경하지 않으면 그것은 순환되는 것 을 막기위해 줄어든다. 다른 순환이 검출되면 에러를 발생한다. 아래에 특수 별명들은 쉘에 의해서 참조된다. 3. 변수치환. 쉘은 변수들의 목록을 가지고 있다. 쉘변수들의 값들은 출력하고 set 와 unset 명령으로 변경할 수 있다. 시스템은 환경변수들에 자신의 목록을 가지 고 있다. 이것은 printenv, setenv 그리고 unsetenv 로 출력하거나 변경할 수 있다. 변수들은 'set -r' 로 읽기전용으로 할 수 있다. 읽기전용 변수들은 갱신하 거나 설정을 없앨 수 없으며 이것을 시도한다면 에러를 낸다. 읽기전용으로 되어있으면 결코 쓸수없으므로 'set -r' 을 사용하는데 주의해야한다. 환경 변수는 읽기전용으로 될 수없다. 일부 변수들은 쉘이 참조하기 위해 그것을 설정한다. argv 변수는 쉘의 인수 목록들이고 이 변수의 값은 특별한 방법으로 참 조할 수 있다. 쉘에 의해서 참조되는 일부 변수들은 토글된다. 쉘은 그 값이 무엇인지를 알지 못하고 단 지 설정되었는지 안되었는지 만을 알 수 있다. verbose 변수는 출력되는 명령 입력을 토글할 수 있다. -v 명령라인 옵션 은 이 변수를 설 정한다. 특수한 쉘변수들이 쉘에의해 참조되는 모든 변수 목 록이다. 다른 동작들은 변수를 숫자로 취급한다. '@' 명령은 수행되는 숫자 계산 을 하고 그 결과를 변수에 할당한다. 그러나 변수 값들은 항상 문자열로 표 현된다. 숫자 연산들의 목적은 널문자열은 0으로 취급하고 여러 단어의 두 번째와 연속한 단어들 값은 무시된다. 입력라인을 별명화하고 설명한 후와 각 명령 이 실행되어지기 전에 수행되 는 변수 치환은 '$' 문자로 정의한다. 이런 확 장은 항상 일어나는 '"' 에서와 결코 일어나지 않는 '`' 를 제외하면 '\' 가 '$' 보다 선행하는 것을 금지할 수 있다. '`' 로 인용되는 문자열 은 후에 인터럽 트된다. 그래서 '$' 는 뒤까지 발생하지 않는다. '$' 는 뒤따르는 공백, 탭, eof 를 변경하지 않고 지나간다. 입출력 리다이렉션은 변수 확장전에 인식되고 따로 변수 를 확장한다. 그렇지만 명령이름과 전체 인수목록은 함께 확장된 다. 첫 번째 단어가 한 단 어 이상 발생하는 것을 가능하게 한다. 명령이름 이 되는 첫단어가되고 나머지는 인수로 된 다. '"' 로 묶여 있지 않거나 변수 치환의 결과가 ':q' 수식어로 주어지지 않으면 결국 명령과 파일이름은 치환 된다. '"' 안에서 여러 단어로 구성된 값을 가지는 변수는 공백으로 분리된 변수 값의 단어를 가진 한 개의 단어로 확장된다. ':q' 수식어가 변수 치환에 있 으면 공백으로 분리된 각 단어를 가진 여러 단어로 확장되고 뒤는 명령 또는 파일이름 치환을 금지하도록 인용한다. 아래 메타시퀀스는 쉘 입력에서 변수값을 제공한다. 주의하지 않으면 설 정되지 않은 변수 를 참조하는 것은 에러를 발생시킨다. ① $name ${name} name 변수값으로 단어를 치환하고 각각은 공백으로 분리한다. {} 는 일부분이 되는 아 래 문자들로부터 name 을 분리시킨다. 쉘변수는 20 문자까지로 구성된 이름을 가진다. 밑줄이 있는 문자는 문자로 간주한 다. name 이 쉘변수가 아니고 환경으로 설정되어 있 으면 그 값을 리턴 한다. 그러나 ':' 수식어와 아래에 주어진 형식은 이렇게 사용할 수 없다. ② $name[selector] ${name[selector]} name 값으로 부터 단지 선택한 단어로 치환한다. selector 는 '$' 치환 에 종속되고 한 개의 숫자나 '-' 로 분리된 2 개의 숫자로 구성되어야 한 다. 변수값의 첫단어는 '1' 이 다. 범위의 첫 숫자가 생략되면 기본적으로 '1' 이다. 범위에서 마지막 숫자가 생략되면 기본적으로 '$#name' 이다. selector '*' 는 모든 단어를 의미한다. 두 번째 인수가 생략 되거나 범위 이어도 에러를 내지 않는다. ③ $0 명령입력을 읽는 파일이름으로 치환한다. name 을 모르면 에러가 발 생한다. ④ $number ${number} '$argv[number]' 와 같다. ⑤ $* '$argv' 와 같고 '$argv[*]' 를 의미한다. ':' 수식어는 히스토리 치환에서 설명한다. ':p' 를 제외하고는 여기에 적용 할 수 있다. 하나 이상이 사용될 수도 있다. {} 는 단지 히스토리 치환에서 처럼 문자 콜론(:)으로 부터 변수 치환을 분리시킬 필요가 있다. 어떤 수식어들은 {} 안에 나타날 수도 있다. 아래 치환은 ':' 수식어로 갱신되지 않는다. ④ $?name ${?name} name 이 설정되어 있으면 '1' 로 치환하고 없으면 '0' 으로 치환한다. ⑤ $?0 현재 입력 파일이름을 알고 있으면 '1' 로 치환하고 그렇지 않으면 '0' 으로 치환한다. 상호작용하는 쉘에서는 항상 '0'이다. ⑥ $#name ${#name} name 에서 단어들의 수로 치환한다. ⑦ $# '$#argv' 와 같다. ⑧ $%name ${%name} name 에서 문자들의 수로 치환한다. ⑨ $%number ${%number} $argv[number] 에서 문자들의 수로 치환한다. ⑩ $? '$status' 와 같다. $$ 부쉘의 프로세스 번호(10 진수)로 치환한다. $! 이 쉘에서 시작된 마지막 백그라운드 프로세스 번호(10 진수)로 치환 한다. $< 이후를 더 이상 해석하지 않고 표준 입력으로 부터 라인으로 치환한 다. 쉘 스크립트에 서 키보드로 부터 읽을 때 사용한다. csh 에서는 마치 '$<:q' 와 같은 것으로 '$<' 를 인용하나 tcsh 에서는 그렇게 작동하지 않는다. 게다가 tcsh 에서 사용자가 타이프하도록 기 다릴 때 라인을 치환하는 시퀀스를 인터럽트하기 위해 인터럽트를 타이 프할 수 있지만 csh 에서는 이것을 사용할 수 없다. 일반적으로 '^X-$' 로 바인드된 expand-variables 편집명령은 상호적으로 각 변수를 확장 할 수 있다. 4. 명령, 파일이름과 디렉토리 스택 치환. 나머지 치환은 선택적으로 내부 명령의 인수들을 적용한다. 이것은 평가 되지 않는 식의 부 분들이 이 식들을 종속하지 않는다는 것을 의미한다. 쉘 에 내부되어 있지 않은 명령들은 명령 이름을 인수 목록으로 부터 치환된다. 부쉘에서 입출력 리다이렉션을 수행한다면 매 우 늦다. 5. 명령 치환 명령 치환은 ''' 로 둘러쌓인 명령들을 지정한다. 명령으로 부터 출력은 공백, 탭과 newline 으로 분리한 단어들을 깨어지 고 널 단어들은 취 소된다. 출력은 변수와 명령 치환이고 원래 문자열의 위 치에 놓는다. 이중 인용(") 안에 있는 명령 치환들은 공백과 탭을 가질 수 있다. 단지 newline 는 강제로 새로운 단어들을 요구한다. 마지막에 단순 newline 은 어 느 경우에나 새로운 단어를 강요 하지 않는다. 명령이 완성 라인을 출력할지라도 명령 치환은 단어 부분을 주는 것이 가 능하다. 6. 파일이름 치환. 단어가 `*', `?', `[', `{' 또는 '~' 로 시작되는 문자들중에 하나다면 'globbing' 로 알려진 지 원자이다. 이 단어는 'glob-pattern' 으로 간주하고 패 턴과 일치하는 파일이름의 알파벳으로 정렬된 목록을 대신한다. 파일이름 일치하는 것에서 '.' 문자로 시작하거나 '/' 에 따르는 것은 '/' 와 정확하게 일치한 다. '*' 문자는 널 문자열을 포함하는 문자들의 어느 문자열 과 일치한다. '?' 문자는 어떤 단 일 문자와 일치한다. '[...]' 시퀀스는 괄호로 둘러싸인 어떤 문자들과 일치한다. '[...]' 에서 '-' 로 분리된 문자들의 쌍은 둘 사이에 사전적으로 일치한다. 일부 glob-pattern 들은 취소 될 수 있다. '[^...]' 시퀀스는 문자들과 괄호로 둘러싸인 문자들의 범위들에 의해 지정되지 않은 어느 단순 문자와 일치한다. 전체 glob-pattern 은 또한 '^' 로 취소될 수 있다. > echo * bang crash crunch ouch > echo ^cr* bang ouch `?', `*', `[]' 로 시작되지 않거나 '{}', '~' 를 사용하는 glob-pattern 은 정 확하게 취소되어 진다. 'a{b,c,d}e' 분석은 'abe ace ade' 의 속기이다. 왼쪽 에서 오른쪽으로 명령은 유지된다. '/usr/source/s1/{oldls,ls}.c' 는 '/usr/source/s1/oldls.c /usr/source/s1/ls.c' 로 확장된다. 일치의 결과는 이 명령을 유지하기 위해 로레벨로 따로따로 정렬한다. '../{memo,*box}' 는 '../memo ../box ../mbox' 로 확장된다. 'memo' 는 '*box' 와 일치의 결 과로 정렬되지 않는 것에 주의해라. 이 구성은 존재하지 않는 파일들로 확장될 때 에러가 아니나 확장된 목록이 통과되는 명령으로 부터 에러가 나는 것은 가능하다. 이 구성은 보존된다. 특별한 경우 '{', '}' 그리고 '{}' 가 통과되어지는 경우 에는 방해하지 않는다. '~' 로 시작하는 파일이름은 홈디렉토리를 참조한다. '~' 이 혼자 있을때에 는 home 쉘변수 의 값에 반영된 사용자의 홈디렉토리로 확장된다. 문자, 숫자, '-' 문자들로 구성된 이름들이 뒤 따를 때 쉘은 그 이름으로된 사용자를 찾고 자신의 홈디렉토리를 치환한다. '~ken' 는 '/usr/ken' 로 확장 되고 '~ken/chmach' 는 '/usr/ken/chmach' 로 확장된다. '~' 문자 뒤 에 알파벳과 다른 문자이거나 '/' 또는 단어의 시작에 어떤 것이 나타나면 방해를 받는다. 'setenv MANPATH /usr/man:/usr/local/man:~/lib/man' 는 작동하지 않 으며 홈디렉토리 치환으로 작동한다. glob-pattern 은 '*', '?', '[', '~' 또는 '^' 가 없으면 에러이고 어떤 파일들과 일치하지 않는 다. 그러나 glob-pattern 의 목록에서 단지 하나의 패턴이 파일과 일치해야 한다. 'rm *.a *.c *.o' 는 현재 디렉토리에서 '.a', '.c', '.o' 로 끝나는 파일이 없 다면 실패이고 nonomatch 쉘변수가 패턴 또는 패턴들의 목록을 설정했 다면 아무것도 일치하지 않으면 에 러를 내는 것보다는 바뀌지 않은 채로 남아 있는다. noglob 쉘변수는 파일이름 치환을 금 지하도록 설정할 수 있고 일반적으로 '^X-*' 로 바인된 expand-glob 편집명령은 단일 파일 이름 치 환을 확장할 수 있도록 한다. 7. 디렉토리 스택 치환. 디렉토리 스택은 디렉토리들의 목록이다. 0에서부터 숫자화되고 pushd, popd 와 dirs 내부 명령들에 의해서 사용되어진다. dirs 는 출력하거나 파일 에 저장하거나 복구하고 디렉토리 스택을 청소(?)하고 savedirs 와 dirsfile 쉘변수는 디렉토리 스택을 자동으로 로그아웃시에 그것을 저장하거나 로 그인시에 복구하도록 설정한다. dirstack 쉘변수는 디렉토리 스택을 찾기 위해 검사하고 디렉토리 스택에 임의의 디렉토리 를 입력한다. 하나 또는 더 많은 숫자를 할당한 '=' 문자는 디렉토리 스택에서 입력한 숫자로 확장한다. 특수한 경우인 '=-' 는 스택에서 마지막 디렉토리를 확장한다. 예를 들어 > dirs -v 0 /usr/bin 1 /usr/spool/uucp 2 /usr/accts/sys > echo =1 /usr/spool/uucp > echo =0/calendar /usr/bin/calendar > echo =- /usr/accts/sys noglob 와 nonomatch 쉘변수들과 expand-glob 편집명령은 파일치환에서 처럼 디렉토리 스 택에 적용한다. 8. 기타 치환. 위에서 확실히 연관되지 않는 파일이름을 포함하는 다양한 변환이 있으 며, 여기서 완벽하 게 언급할 것이다. symlinks 가 'expand' 로 설정되어 있 으면 어느 파일이나 전체 경로로 확장된다. 인용은 이 확장을 금지하고 normalize-path 편집명령은 그것을 요구한다. normalize-command 편집명령은 전체 경로로 PATH 에 있는 명령들을 확장한다. 결국 cd 와 pushd 는 전에 작업한 디렉토리로서 '-' 를 해석한다. 이것은 전혀 치환이 없으 나 생략은 단지 이런 명령으로 인식한다. 그런데도 그것 은 인용함으로서 막을 수 있다. IX. 명령(COMMAND) 다음은 쉘이 명령을 어떻게 실행하고 입출력을 다루는 방법을 설명한다. 1. 단순 명령과 파이프라인 그리고 시퀀스. 단순 명령은 명령이 실행되도록 지정하는 첫 단어 시퀀스이다. '|' 문자들로 이루어진 단순 명령들의 배열은 파이프라인 형식이다. 파이프 라인에서 각 명 령의 출력은 다음 명령의 입력이다. 단순 명령과 파이프라인 은 ';' 와 함께 할 수 있고 이 것은 연속적으로 명령을 실행한다. 명령들과 파이프라인들은 C 언어에서와 같이 '||' 또는 '&&' 와 함께 할수 있으며 두 번째 명령은 첫 번째 명령이 실패하거나 성공했을 때에만 실행된다. 단순 명령, 파이프라인, 시퀀스는 차례로 파이프라인 또는 시퀀스의 구성부분이 되는 간단 명령으로 형식화하기 위해서 ()로 지정할 수 있다. 명령, 파이프라 인 또는 시퀀 스는 뒤에 '&' 를 수반하면 종료하기를 기다리지 않고 실행한 다. 2. 내부 명령과 외부 명령 실행. 내부 명령은 쉘 자체에서 실행할 수 있다. 마지막을 제외한 파이프라인의 구성요소는 내부 명령이고 파이프라인은 부 쉘에서 실행된다. 괄호가 있는 명 령들은 항상 부쉘에서 실행된 다. (cd; pwd); pwd 현재 작업디렉토리를 변경하지 않고 홈디렉토리를 출력한다. 이것은 (cd; pwd) 를 실행할 때만 홈디렉토리로 이동한다. 괄호가 있는 명령들은 대부분 cd 가 현재 쉘에 영향을 주는 것을 막기위 해 사용된다. 명령이 실행될 때 내부 명령이 아니면 쉘은 execve 를 통해서 명령 실행 을 시도한다. path 변수의 단어들은 쉘이 명령을 찾을 디렉토리들이다. -c 나 -t 옵션 이 없다면 쉘은 내 부 테이블에 있는 디렉토리에서 이름을 찾아서 명령이 존재하는 가능성이 있다면 디렉토리 에서 execve 를 통해 명령 실행을 시도 할 것이다. 이것은 많은 디렉토리가 찾을 경로에 있 다면 명령위치 속도를 향상시킨다. 이 기능이 꺼져 있거나 -c 나 -t 인수를 주었다면 쉘은 현재 작업 디렉토리를 연결하여 그것과 같은 이름의 파일이 있으면 실행한다. 파일이 실행 허가권을 가지고 있으나 시스템에서 실행할 수 없으면 쉘 명 령들을 포함하고 있는 파일인지를 확인하고 새로운 쉘이 그것을 읽도록 시도한다. shell 특수 별명은 쉘 자 신보다는 다른 명령해석기를 지정하기 위해 설정할 수 있다. '#!' 스크립트 해석기 대표자를 이해하지 못하는 시스템에서 쉘은 그것을 에뮬레이트하도록 컴파일되어야 한다. '#!interpreter arg ...' 형식이 있는지 알아보기위해 파일의 첫 라인을 검 사한다. 그래서 있다면, 쉘은 주어진 인 수(args)로 해석기를 시작하고 파일을 표준 입력으 로 줄 것이다. X. 입출력(INPUT & OUTPUT) 명령의 표준 입출력은 아래 구문에의해 재지정할 수 있다. ① < name 표준 입력으로 사용할 파일을 name 으로 연다. ② << word word 로 지정한 라인의 끝까지 쉘 입력을 읽는다. word 는 변수가 아 니고 파일이름이 나 명령치환이고 각 입력 라인은 치환들이 이 입력라인 을 실행하기 전에 word 와 비교 한다. '\', '"', '', '`' 인용은 word 변수에 표현되지 않았다면 명령치환은 '$', '\', '`' 를 인 용하기 위해 '\' 를 사용하 여 중재하는 라인들을 실행한다. 치환된 명령들은 공백과 탭 그리고 마지막 newline 을 제외한 예약된 newline 을 가질 수 있다. 결과 텍스트는 표준 입력으로 명령에서 주 어진 임시 파일에 위치하게 된다. ③ > name >! name >& name >&! name 파일 name 을 표준 출력으로 사용한다. 파일이 없으면 만든다. 파일이 있다면 그것을 사용하는데 전에 있던 내용은 삭제된다. noclobber 쉘변 수가 설정되어 있으면 파일이 없거나 문자 특수 파일, 즉 터미널 또는 /dev/null 이거나 에러를 낸다. 이것은 사고로 파일을 파괴하는 것을 막 아준다. 이럴 경우에 '!' 형식을 사용하여 이런 점검을 강제로 금지할 수 있다. '&' 형식은 출력을 지정한 파일뿐만 아니라 표준 출력으로도 출력한 다. 같은 방법으로 '<' 형식의 입력에 대해서도 사용된다. ④ >> name >>& name >>! name >>&! name '>' 과 같으나 파일 name 의 끝에 추가한다. noclobber 쉘변수가 설정되어 있고 '!' 형식으로 지정하지 않았으면 파 일이 없다면 에러 를 낸다. 명령은 쉘 입출력 파라미터들과 파이프라인에서 명령의 존재를 갱신되도 록하는 환경을 받 는다. 일부 예전 쉘들은 명령들이 쉘 명령들의 파일로 부 터 실행한다. 내정값으로 명령들의 텍스트를 접근을 가지고 있지 못하고 원래 표준 입력으로 부터 받는다. '<<' 기능은 인라인 데이터를 표현한다. 이것은 쉘명령 스크립트들이 파 이프라인의 구성요 소로서 기능을 수행하도록 하고 쉘이 그것의 입력을 읽 는 것을 방해한다. 독립적으로 실행 되는 명령을 위해 내정 표준 입력은 /dev/null 이 아니라 쉘의 원래 표준 입력이다. 이것이 터미널이고 프로세 스가 터미널로 부터 읽기를 시도하면 프로세스는 정지되고 사용자에게 알 릴 것이다. 출력 진단은 파이프를 통해 표준 출력으로 다이렉트될 것이다. 간단 하게 단지 '|' 보다는 '|&' 를 사용하는 것이 좋다. 쉘은 표준 출력을 리다 이렉션 없이 출력 진단을 리 다이렉트하지 않을 것이고 '(command > output-file) >& error-file' 는 좋은 작업환경을 제공한다. 출력파일과 에 러파일은 출력을 터미널로 보내기 위해 '/dev/tty' 일 것이다. XI. 기능(FEATURES) 쉘이 어떻게 적용되고 설명하고 명령라인들을 실행하는 것을 기술함으로서 이제 그 사용할 수 있는 기능의 여러 가지를 배울 것이다. XII. 제어 흐름(CONTROLL FLOW) 쉘은 명령 파일(쉘 스크립트)와 터미널 입력에서 제어 흐름을 규정하는 명령 들의 번호를 가지 고 있다. 이 명령은 모두 입력에서 강제로 다시 읽거나 통과 하고 수행하고 일부 명령의 위치 를 제한하도록 수행할 수 있다. foreach, switch, while 문 그리고 if 문의 if-then-else 형식은 주 키워드가 한 라인에서 단순 히 한 명령만 있도록 요구한다. 쉘의 입력을 찾을 수 없다면 루프를 읽고 수행할때는 루프에 서 암시한 내부 버퍼를 다시 읽어서 끝내도록 찾는다. XIII. 식(Expressions) if, while 그리고 exit 내부 명령들은 일반적인 구문으로 된 식을 사용한다. 식은 다음 세 부분 에서 기술한 연산자를 포함할 수 있다. @ 내부명령은 그 자 신을 분리하는 구문을 가진다는 것에 주의해라. 1. 논리, 산술 그리고 비교 연산자. 이 연산자들은 C 언어에서와 비슷하고 같은 우선 순위를 갖는다. || && | ^ & == != =~ !~ <= >= < > << >> + - * / % ! ~ ( ) 여기서 우선순위는 오른쪽으로 증가하고 `==' `!=' `=~' 와 `!~', `<=' `>=' `<' 와 `>', `<<' 와 `>>', `+' 와 `-', `*' `/' 그리고 `%' 는 같은 우선 순위이다. `==' `!=' `=~' 그리고 `!~' 연산자는 문자열을 비교한다. 다른 것은 수를 비교한다. 왼쪽과 일치하는 것에 대해 오른쪽이 글로벌 패턴이다는 것을 제외하면 `=~' 와 `!~' 연산 자는 `!=' 그리고 `==' 와 같다. '0' 으로 시작되는 문자열은 8진수로 간주한다. 널이나 인수가 없으면 '0' 으로 간주한다. 모든 식의 결과는 10진수로 표현되는 문자열이다. 2. 명령 종료 상태 명령들은 식으로 실행될 수 있고 그 종료 상태는 중괄호({})로 둘러쌓여 서 리턴한다. 중괄 호는 공백에 의해 명령으로 부터 분리되어져야 한다는 것을 기억해라. 명령이 성공적으로 실행되었다면 사실, 즉 '1' 을 리턴하고 실패했다면 거 짓, 즉 '0' 을 리턴 한다. 더 세밀한 상태 정보를 얻고 싶으면 명령을 식 밖 에서 실행하고 status 쉘 변수를 검 사해 보아라. 3. 파일 검사 연산자 어떤 연산자들은 파일이나 관련 대상에서 사실/거짓 상태 검사를 수행한 다. 형식은 -op 파 일이며 아래에 op 의 종류가 있다. r : 읽기 접근. w : 쓰기 접근. x : 실행. X : 외부 또는 쉘 내부 실행, 즉 '-X ls' 와 '-X ls-F' 는 사실이지만 '-X /bin/ls' 는 거 짓이다. e : 존재여부. o : 소유자. z : 크기가 0 인지의 여부. s : 크기가 0 이 아닌지의 여부. f : 보통 파일. d : 디렉토리. l : 기호 링크. b : 블록 특수 파일. c : 문자 특수 파일. p : 파이프(fifo). S : 소켓 특수 파일. u : 사용자 ID 비트 설정. g : 그룹 ID 비트 설정. k : 고정 비트 설정. t : 터미널 장치를 설명하는 파일. L : 다중 연산자 검사에서 링크가 지정한 파일보다는 기호링크를 뒤의 연산자들에 적용 한다. file 은 확장된 명령과 파일이름이고 실제 사용자에 대한 지정한 관계가 있다면 그것을 검 사한다. file 이 존재하지 않거나 접근할 수 없거나 '*' 로 지정된 연산자 이거나 정의한 파 일 형식이 현재 시스템에 존재하지 않으면 모든 질문은 거짓 즉, '0' 을 리턴한다. 이런 연산자들은 조합할 수 있다. 예를들어 '-xy file' 는 '-x file & -y file' 과 같다. '-fx' 는 디렉토리가 아닌 평범한 실행 파일이면 사실 즉, '1' 을 리턴한다. '-lLo' 은 지정한 사용자에 의해 소유한 링크들은 사실이다. Lr, Lw 그리 고 Lx 는 링크되 어 있으면 사실이고 링크되어 있지 않으면 거짓이다. L 은 다중 연산자 검사에서 마지막 연산자일때는 의미가 달라진다. 특별하게 파일 이 아닌 연산자와 함께하는 L 은 이상한 결 과를 낳는다. 다른 연산자들은 '0' 이나 '1' 이 아닌 다른 정보를 리턴한다. 이것들은 전과 같은 형식이고 op 는 다음중에 하나이다. A - 마지막으로 파일에 접근한 시간. A: - A 와 같으나 시간 형식이 'Fri May 14 16:36:10 1993' 이다. M - 마지막으로 파일을 갱신한 시간. M: - M 과 같으나 파일 형식이 다르다. C - 마지막으로 inode 를 갱신한 시간. C: - C 와 같으나 시간 형식이 다르다. D - 장치 번호. I - Inode 번호. F - device:inode 형식으로된 복합 파일 식별자. L - 기호 링크에 의해 지정된 파일 이름. N - 하드 링크들의 수. P - 0 을 선행하지 않는 8진수 허가권. P: - P 와 같으나 0을 선행한다. Pmode - '-P file & mode' 과 같다. '-P22 file' 은 파일이 그룹과 다 른 사용자에의해서 쓸수 있으면 '22' 를 리턴하고 단지 그룹만이 쓸수 있으면 '20' 을 리턴하며 다른 경 우에는 '0' 을 리턴한다. Pmode: - Pmode 와 같으나 0을 선행한다. U - 숫자로된 사용자 ID. U: - 사용자 이름, 사용자 이름이 없다면 사용자 ID. G - 숫자로된 그룹 ID. G: - 그룹 이름, 그룹이름이 없다면 그룹 ID. Z - 크기(단위:바이트). 단지 이들중에 하나만이 다중 연산자 검사에 나타날 수 있고 마지막에 있 어야 한다. 다중 연산자 검사에서 L 이 끝에 있으면 다른 의미를 가진다는 것에 주 의해라. 대부분의 연산자들은 검사가 사실일 때 '0' 을 리턴하지 실패했을 때 '0' 을 리턴하지 않고 '-1' 을 리 턴하고, F 는 ':' 를 리턴한다. 쉘이 POSIX 로 컴파일되었을때 파일 검사의 결과는 access 시스템 호출 이 아닌 파일의 허가 비트에 기초한다. 예를 들어, 읽기 전용으로 마운트되 지 않은 일반적으로 쓰기가 허용 된 파일의 테스트인 -w 는 POSIX 쉘에서 는 성공을 리턴하나 POSIX 가 아닌 쉘에서는 실패를 리턴한다. 또한 파일 검사 연산자는 filetest 내부명령으로 평가한다. X IV. 작업 쉘은 파이프라인으로 작업과 연계되어 있다. jobs 명령으로 출력되는 현재 작 업들의 테이블을 유지하고 그것들은 작은 정수를 할당받게 된다. 작업이 '&' 로 시작되었을 때에는 쉘은 [1] 1234 와 같은 라인을 출력한다. [1]의 의미는 배경작업으로 시작되는 작업은 단지 지금 실행한 하나의 프로세스를 가지고 있 다는 의미이고 이 작업의 프로세스 ID 는 1234 이다는 것을 지 시한다. 작업을 실행하고 현재 작업에 STOP 시그널을 보내기 위해서 지연키 일반적 으로 '^Z' 를 타이 핑하여 다른 것을 작업하고 싶다면 쉘은 작업이 지연되었다 는 것을 가리키기 위해서 'Suspend' 를 출력하고 프롬프트를 출력한다. listjobs 쉘변수가 설정된다면 모든 작업들은 jobs 내부 명령과 같이 모든 작 업들을 출력할 것 이다. 'jobs -l' 과 같이 작업 목록을 긴 형식으로 하고 싶으 면 'long' 으로 설정한다. 지연된 작업의 상태를 조정할 수 있다. bg 명령이나 다른 명령으로 'backgroud' 로 할 수 있고 실제 적으로 fg 명령으로 배경작업을 'foreground' 으로 할 수 있다. '^Z' 는 즉시 영향력을 발휘하고 타이프되었을 때 출력을 기다리고 읽지 않은 입력을 취소하는 인터럽트와 같다. wait 내부명령은 쉘이 모든 배경작업들이 완료되도록 기다린다. '^]' 키는 프로그램이 그것을 읽을 때까지 STOP 시그널을 발생하지 않는 지 연 시그널을 현재 작업에 보낸다. 이것은 보통 그것들을 읽은 후에 멈추기를 원하는 작업에 어떤 명령이 주어졌 을 때 타이프할 수 있다. '^Y' 키는 csh 에서 이 기능을 수행하고 tcsh 에서는 편집 명령이다. 터미널로 부터 읽기를 시도할 경우에는 배경에서 실행되고 있는 작업을 멈춘 다. 일반적으로 배경작업들은 출력을 발생할 수 있으나 'stty tostop' 명령을 줌 으써 비활성화 할 수 있다. 이 tty 옵션을 설정한다면 배경작업들은 입력을 읽을때와 같이 출력을 발생할때에 멈추게 될 것 이다. 쉘에서 작업들을 참조하기 위한 여러 가지 방법들이 있다. '%' 는 작업 이름 을 받아 들인다. 작업번호 1을 참조하고자 한다면 '%1' 로 그것을 참조할 수 있 다. 단지 작업이름을 주는 것은 전경작업으로 된다. '%1' 은 'fg %1' 과 같으므 로 작업번호 1을 전경작업으로 되돌린다. 비슷 한 방법으로 '%1 &' 은 'bg %1' 과 같이 작업 번호 1을 배경작업으로 되돌린다. 작업은 또한 그것을 시작하기 위해 타이프되어진 문자열의 애매한 접두사로 사용할 수 있다. '%ex' 는 지연된 작업중에서 'ex' 로 시작하는 작업이 하나 만 있을 경우에 ex 작업을 정상적 으로 재시작한다. 또한 string 을 포함하는 단 지 작업이 하나만 있다면 '%?string' 로 정의할 수도 있다. 쉘은 현재와 전 작업들을 기억하고 있다. 현재 작업은 '+' 로 전 작업은 '-'로 연관되어 있다. '%+', '%', '%%' 는 모두 현재 작업을 참조하고 '%-'는 전 작업 을 참조한다. 작업 제어 기능은 stty 에 'new' 라는 옵션이 설정되어 있어야 한다. 작업들 이 멈출 수 있도록 키보드 인터럽트를 발생하도록 tty 드라이버의 'new' 수행으 로 부터 가공한다. 1. 상태 보고 쉘은 프로세스 상태가 변경될때면 즉시 보고한다. 일반적으로 작업이 다음 프로세스가 가능하거나 단지 프롬프트를 출력하기전에 방해될때 면 언제나 이러한 정보를 제공한다. 이것은 당신의 작업이 방해받지 않 도록 작동한다. 쉘변수 notify 를 설정한다면 쉘은 배 경작업들의 상태가 변경되면 즉시 알려준다. 또한 쉘 명령 notify 는 하나의 프로세스의 상 태가 변경되면 즉시 보고하도록 할 수 있다. 기본값으로 notify 는 현재 프로세 스를 가지며 백그라운드 작업이 시작되면 'notify' 라고 간단히 보고한다. 작업들이 정지하는 동안에 쉘을 종료하려고 하면 `You have stopped jobs.' 라는 경고 를 받을 것이다. 그런 작업들이 어떤 것인지 알기위해서 jobs 명령을 사용할 수 있다. 다시 종료하기를 시도한다면 쉘은 경고를 안하고 지연된 작업들을 종료할 것이다. 2. 자동, 기간, 예정 작업 명령을 실행하고 쉘이 실행중인 동안에 여러 시간에 자동적으로 다른 동작을 취하는 다양한 방법이 있다. 여기서는 이러한 작업에 대해 살펴 보기로 하겠다. 세부사항은 아 래에 설명된 내부 명령과 특수 쉘변수 그리 고 특수 별명들을 참고해라. sched 내부명령은 주어진 시간에 쉘에 의해 실행될 예정된 목록에 명 령들을 입력한다. beepcmd, cwdcmd, periodic, precmd 와 같은 특수 별명들은 경고음을 울리고 작업디렉 트리를 변경하고 매 tperiod 의 시간마다 실행하고 각 프 롬프트전에 명령들을 실행하고 자 할 때 설정한다. autologout 쉘변수는 주 어진 시간동안 시스템이 동작하지 않으면 쉘을 나갈 때 사용한다. mail 쉘변수는 새 메일을 정기적으로 점검하기 위해서 설정한 다. printexitvalue 쉘변수는 0 과 다른 상태로 종료하는 명령들의 종료상태를 출력 한다. rmstar 쉘변수는 'rm *' 가 타이프되었을 때 정말로 실행할 것인지 를 사용자에게 물어 본다. time 쉘변수는 CPU 초로 주어진 시간보다 더 걸리는 프로세스 종료후에 time 내 부명령을 실행한다. watch 와 who 쉘변수는 지정한 사용자들이 로그인 또는 로그아웃 하는 것을 보고하고 log 내부명령은 언제나 이러한 사용자들을 보고한다. X V. 국제 언어 시스템 지원 (+) 쉘은 8비트를 완벽히 지원하지만 이 특성은 문자 세트를 필요로 한다. NLS 지원은 쉘이 시스 템의 NLS 를 사용하도록 컴파일되었거나 되었는지에 의존 하는 것과 다르다. 7 비트 ASCII 는 문자 분류와 문자 정렬의 기본이며 LC_CTYPE 또는 LANG 환경변수들을 변경하여 점검 할 수 있다. 시스템의 NLS 를 사용할 때 setlocale 기능은 적절한 문자 분류와 정렬을 정의할 수 있 다. 이 기능은 LANG 또는 LC_CTYPE 환경변수를 점검한다. 세부사항은 시스템 문서를 참조하 라. 시스템의 NLS 를 사용하지 않을경우에는 쉘은 ISO 8859-1 문자 세트는 LANG 과 LC_CTYPE 변수가 설정되어 있을 때에는 그 값 에 관계없이 시뮬레이트한다. 정렬은 시뮬레 이트된 NLS 에서는 효과가 없다. 실 제 또는 시뮬레이트된 NLS 는 \200-\377 범위의 모든 프 린트 가능한 문자들, 즉 M-char 로 바인딩되어 있는 문자들은 자동적으로 self-insert-command 로 리바인딩된다. 이스케이프 문자에 대한 응답은 그대로 있다. 이런 문 자들은 NOREBIND 환경변수가 설정되어 있으면 리바인드되지 않는다. 이것은 시뮬레이트된 NLS 나 ISO 8859-1 을 사용하는 NLS 에서 사용 한다. 그렇지만 \240-\377 범위의 모든 M-char 바인딩은 효과적으로 동작 하지 않는다. 물론 명백히 관련된 키들을 바인드키로 리바 인딩하는 것도 여전 히 사용할 수 있다. 프린트할 수 없거나 제어문자들은 \nnn 형식으로 출력 된 다. tty 가 8 비트 모드가 아니면 8 비트 문자들은 ASCII 로 변환되어 출력된다. 쉘은 7/8 비트 모드로 변경할 수 없다. NLS 사용자들, 즉 메타 키를 사용하기 를 원하는 사용자들은 ~/.login 파일에 stty 명령으로 tty를 8 비트 모르로 명백히 설정해야 한다. X VI. 다양한 운영체제 지원 새로운 내부 명령들은 특별한 운영체제에서 제공한다. 모든 것은 내부 명령 에 자세히 설명되 어 있다. TCF (aix-ibm370, aix-ps2) 를 지원하는 시스템에 서 getspath 와 setspath 는 시스 템 실행 경로를 얻거나 설정하고 getxvers 와 setxvers 는 시험 버전 접두사를 얻거나 설정하 고 migrate 는 사이트간에 프 로세스를 옮긴다. jobs 는 각 작업이 실행되는 사이트를 출력한 다. Domain/OS 에서 inlib 는 현재 환경에 공유 라이브러리를 추가하고 rootnode 는 루트 노 드 를 변경하고 ver 는 시스템 타입을 변경할 수 있다. Convex/OS 에서 warp 는 universe 를 설정하거나 출력한다. VENDOR, OSTYPE 그리고 MACHTYPE 환경변수는 쉘이 실행되고 있는 시스템 제공자, 운 영체제 그리고 시스템 종류를 지정한다. 이것들은 부분적으 로 여러 종류의 시스템사이에 자신 의 홈 디렉토리를 공유할 때 사용할 수 있 다. 예를 들어, 자신의 ~/.login 에 set path = (~/bin.$MACHTYPE /usr/ucb /bin /usr/bin .) 위와 같이 설정하면 각 시스템의 적당한 디렉토리에서 실행할 수 있다. version 쉘변수는 쉘이 컴파일될 때 어떤 옵션을 선택해야 하는지를 지정한 다. newgrp, afsuser 그리고 echostyle 쉘변수와 쉘의 입력파일들의 시스템의존 위치에 주의해라. X VII. 신호 처리 로그인 쉘은 ~/.logout 파일을 읽을 때에는 인터럽트를 무시한다. 쉘이 -q 로 시작하지 않았다 면 종료 시그널을 무시한다. 로그인 쉘은 종료 시그널을 잡으나 비 로그인 쉘은 그들의 모(母) 쉘로 부터 종료 동작을 계승한다. 다른 시그널 은 그것의 모 쉘로부터 계승했던 값들을 가진다. 쉘 스크립트에서 인터럽트의 쉘처리와 종료 시그널들은 onintr 로 제어하고 고장(hangup) 처 리는 hup 와 nohup 로 제어한다. 쉘은 hangup 을 종료한다. 기 본적으로 자(子) 쉘도 그렇게 동작하나 쉘이 종료할 때 hangup 시그널을 보내 지 않는다. hup 는 쉘이 종료할 때 자(子) 쉘에게 hangup 시그널을 보내는 것을 조정하 고 nohup 는 hangup 을 무시하도록 설정한다. X VIII. 터미널 운영 (+) 터미널(tty) 모드의 세가지 다른 설정사항을 사용한다. 편집할 때 사용하는 'edit', 문자들을 인용하기위한 'quote' 그리고 명령들을 실행할 때 사용하 는 'execute' 이다. 쉘은 각 모드 상수에 어떤 설정사항을 가지고 있으므로 혼란스러운 상태에서 tty 를 떠나는 명령들은 쉘을 방해할 수 없다. 상수를 유지하는 tty 모드 목록 은 setty builtin 으로 실행하거 나 변경할 수 있다. 편집기가 CBREAK 모드 또는 그것과 동등하게 사용하더라도 미리 타이 프된 문자들을 가지고 있다는 것 에 주의해라. echotc, settc 그리고 telltc 명령들은 명령라인으로 부터 터미널 특성을 조정 하거나 정정할 수 있다. SIGWINCH 와 SIGWINDOW 를 지원하는 시스템에서 쉘은 자동으로 환경 변수 LINES 과 COLUMNS 로 윈도우즈 크기를 조정할 수 있다. 환경변수 TERMCAP 에 li# 와 co# 필드가 있다면 쉘은 그것을 새 윈도우 크기로 사용 한다. X IX. 내장 명령(BUILTIN COMMAND) 1. %job fg 내장 명령과 같다. 2. %job & bg 내장 명령과 같다. 3. : 성공하면 어떤 것도 동작하지 않는다. 4. @ 그리고 @ name = expr 또는 @ name[index] = expr 첫 번째 형식은 모든 쉘 변수들의 값을 출력한다. 두 번째 형식은 expr 의 값에 정의한 이 름을 설정한다. 만약 expr 이 '<', '>', '&' 또는 '' 를 포 함한다면, expr 에 '()' 안에 위치해 야한다. 세 번째 형식은 name 의 index 번째 인수에 expr 의 값을 할당한다. name 과 그 것의 index 번째 구성요소 가 이미 존재해야 한다. expr 는 '*', '+' 등의 연산자를 포함할 수 있다. 할 당 연산자로부터 이름을 분리하는 공간은 선택적이다. 그러나, 공간은 한 단어로 된 expr 의 분리하는 구성요소 안에서는 임의적이다. 특수한 접두사 '+' 와 '-' 는 '@ I++' 과 같이 name 을 각각 증가 또는 감소하도록 작동한다. expr 의 구문은 Expressions 에 기술 된 것과 관계가 없다는 것에 주의해라. 5. alias [name [wordlist]] 인수가 없으면 모든 별명들을 출력한다. 이름을 준다면 이름에 대한 별명 을 출력한다. 이름 과 wordlist 를 준다면 이름에 해당하는 별명에 wordlist 에 할당한다. wordlist 는 명령과 파일이름이다. 이름은 'alias' 또는 'unalias' 가 아니어야 한다. unalias 내장 명령을 참고해라. 6. alloc 사용되거나 남은 메모리를 요구하거나 되돌려 놓을 동적인 메모리의 양을 보여준다. 인수 로 각 크기 목록에서 남거나 사용되는 블록의 수를 보여준 다. 목록은 8 그리고 16 크기로 시작한다. 이 명령의 출력은 시스템 형식에 따라 다양하고 VAX 와 다른 시스템들은 다른 메모리 할당을 사용할 지도 모른다. 7. bg [%job ...] 정의된 작업 또는 인수가 없으면 현재 작업을 배경작업 상태로 전환한다. job 은 작업 목 록에 기술된 숫자이거나 문자열 또는 '', '%', '+' 또는 '-' 일 수 있다. 8. bindkey [-l|-d|-e|-v|-u] (+) bindkey [-a] [-b] [-k] [-r] [--] key (+) bindkey [-a] [-b] [-k] [-c|-s] [--] key command (+) 옵션이 없으면, 첫 번째 형식은 모든 바인드 키와 각각에 바인드된 편집 명령을 출력하고 두 번째 형식은 키로 바인드된 편집명령을 출력하고 세 번째 형식은 편집명령 command 를 키로 바인드한다. ① -l 모든 편집명령과 짧은 설명을 출력한다. ② -d 기본 편집기를 위해 표준 바인딩에 모든 키들을 바인드한다. ③ -e 모든 키들을 표준 GNU Emacs 와 같은 바인딩으로 바인드한다. ④ -v 모든 키들을 vi 와 같은 바인딩으로 바인드한다. ⑤ -a 선택적인 키 맵에서 키 바인딩을 출력하거나 변경한다. 이것은 vi 명령모드에서 사용하는 키 맵이다. ⑥ -b 키를 제어문자로 해석한다. 예를들어 ^character 즉 `^A' 또는 C-character 즉, `C-A' 또는 M-character 즉, `M-A', 펑크션 키인 F-string 즉, `F-string' 또는 확장 접두사 키 X-character 즉, `X-A' 와 같이 해석된다. ⑦ -k 키를 `down', `up', `left' 또는 `right' 와 같이 화살표 키 이름중 하나 로 해석한다. ⑧ -r 키 바인딩을 제거한다. `bindkey -r' 는 키를 자체 삽입 모드로 바인 드하지 않고 키를 완전히 바인드하지 않게 된다는 것에 주의해라. ⑨ -c 명령을 편집명령으로 해석하는 대신에 내장 또는 외부 명령으로 해석 한다. ⑩ -s 명령을 문자열 그대로 인식하고 키가 타이프되었을 때 터미널 입력으 로 취급한다. 명령에 바인드된 키는 그 자체를 새롭게 해석하고 이것은 해석의 10 단계까지 계속된 다. -- 옵션처리를 강제로 끝낸다. 그래서 다음 단어가 '-'로 시작하여도 키로 서 해석한다. -u (또는 부적당한 옵션) 사용법을 출력한다. 키는 한 문자이거나 문자열 일 수 있다. 명령이 문자열로 바인드된다면 문자열의 첫 번째 문자는 sequence-lead-in 으로 인식하고 나머지는 전부 명령으로 바인드된다. 키에서 제어문자는 일반적으로 '^V'로 바인드된 편집명령 quoted-insert 가 선행하여 타이 프 될 수 있는 문자 그대로 나타나거나 '^A' 와 같은 caret-charater 로 나타날 수 있다. 삭제는 '^?' 로 나타난다. 키와 명령은 아래와 같은 백슬래쉬(\) 이스케이 프 시퀀스를 포함 할 수 있다. \a : 경고음. \b : 백스페이스. \e : 이스케이프(ESC). \f : Form feed \n : Newline \r : Carriage return \t : Horizontal tab \v : Vertical tab \nnn : 8진수 nnn 에 해당하는 ASCII 문자. '\' 그리고 '^' 를 가지고 있다면 '\' 는 다음 문자의 특별한 의미를 무시한 다. 9. break 가장 가까이에 있는 foreach 나 while 를 끝내고 뒤를 계속 실행한다. 현 재 라인에 있는 남 은 명령들을 실행한다. 다중 레벨 break 는 한 라인에 그 것을 모두 기술해서 할 수 있다. 10. breaksw endsw 뒤를 수행하기 위해 switch 를 끝낸다. 11. builtins (+) 모든 내장 명령들의 이름을 출력한다. 12. bye (+) logout 내장 명령과 같다. 단지 쉘이 그렇게 컴파일되었을때에만 사용가능 하다. 13. case label: 아래에 설명한 switch 문에서 사용하는 라벨이다. 14. cd [-p] [-l] [-n|-v] [name] 디렉토리 이름이 주어진다면, 쉘의 작업디렉토리를 디렉토리 이름으로 변 경한다. 주어지지 않으면, 홈디렉토리로 변경한다. 디렉토리 이름에 '-' 를 주면, 전에 작업한 디렉토리로 변 경한다. '/', './' 또는 '../' 로 시작하지 않고 현재 디렉토리의 서브디렉토리가 아니면 쉘변수 cdpath 에 기술한 서브디 렉토리인지를 검사한다. 결국 아무런 일치가 없으면 '/' 로 시작되 는 서브 디렉토리인지를 검사하여 그런 디렉토리가 있으면 그 디렉토리로 이동한다. -p 옵션이 있으면 dirs 처럼 마지막 디렉토리 스택을 출력한다. -l, -n, -v 옵션도 dirs 에 서 처럼 cd 에 같은 효과를 준다. 15. chdir cd 내부 명령과 같다. 16. complete [command [word/pattern/list[:select]/[suffix]/...]]] (+) 인수가 없으면 모든 완성목록을 출력한다. 인수로 command 가 있으면 command 를 위한 완성목록을 출력한다. 인수로 command 와 word 등이 있으면 완성을 정의한다. command 는 전체 명령이름이나 globe-pattern 이 어야한다. 완성이 단지 command 이 애매할 때만 사용하도록 하기위해 '-' 로 시작 할 수 있다. word 는 현재 단어와 연관된 단어가 완성되도록 아래와 같이 정의한다. ① c 현재 단어 완성. pattern 은 명령라인에 있는 현재 단어의 시작과 일치하는 glob-pattern 이다. pattern 은 현재 단어가 완성되었 을때는 무시된다. ② C c 와 같으나 현재 단어가 완성되었을때에도 pattern 을 포함한다. ③ n 다음 단어 완성. pattern 은 명령라인에 있는 앞 단어의 시작과 일 치하는 glob-pattern 이다. ④ N n 과 같으나, 현재 단어 앞의 두 단어의 시작과 일치해야한다. ⑤ p 위치 의존 완성. pattern 은 현재 단어를 포함하는 쉘 변수를 지정 하기위해 사용하 는 것과 같은 구문을 가진 숫자 범위이다. list 는 아래 인수중에 하나와 같이 가능한 완성의 목록이다. ① a : 별명. ② b : 바인딩(편집명령). ③ c : 내부 또는 외부 명령. ④ C : 주어진 경로로 시작되는 외부 명령. ⑤ d : 디렉토리. ⑥ D : 주어진 경로로 시작되는 디렉토리. ⑦ e : 환경변수. ⑧ f : 파일이름. ⑨ F : 주어진 경로로 시작되는 파일이름. ⑩ g : 그룹이름. j : 작업. l : 제한들. n : 어떤 행동도 하지 않음. s : 쉘변수. S : 시그널. t : 단순 텍스트 파일. T : 주어진 경로로 시작하는 단순 텍스트 파일. v : 어떤 변수. u : 사용자 이름. x : n 과 같으나, list-choices 가 사용되었을 때 select 를 출력한 다. X : Completions $var : 변수 var. (...) : 주어진 목록에서의 단어. `...` : 명령의 출력으로부터 온 단어. select 는 선택할 수 있는 glob-pattern 이다. 주어진다면 select 와 일치 하는 list 에서 온 단어들로 간주하고 fignore 쉘변수는 무시된다. 완성의 마지막 세가지 종류는 select 패턴을 가지고 있지 않고 x 옵션은 list-choices 편집 명령이 사용될때에 설명 메시지로서 select 를 사용한다. 접미사는 성공적인 완성에 추가되는 한 문자이다. 비어있다면 어떤 문자 도 추가되지 않는 다. 생략한다면 디렉토리일때에는 슬래쉬(/)를 추가하고 다른 것일때에는 공백이 추가된다. 예를들어 보기로 하겠다. 일부 명령들은 인수로 디렉토리만을 가지므로 단순 파일을 지정할 수 없 다. > complete cd 'p/1/d/' 위와 같기 지정하면 디렉토리로 단어를 완성한다. p 옵션 완성은 아래 화 살표 명령 완성으 로 사용할 수 있다. > co[^D] complete compress > complete -co* 'p/0/(compress)/' > co[^D] > compress 이 완성은 'co' 로 시작하는 것들중에 'co*' 와 일치하는 명령으로 완성하 므로 여기서는 목 록에 있는 단어인 'compress' 로 완성된다. 앞의 '-' 는 완성이 애매할 경우에 사용한다는 것을 지정한다. > complete find 'n/-user/u/' 위는 n 옵션 완성의 예이다. 'find' 명령은 즉시 '-user' 는 사용자 목록에 서 완성하라는 뜻 이다. > complete cc 'c/-I/d/' 위는 c 옵션 완성의 예이다. 'cc' 명령은 '-I' 로 시작하는 디렉토리로서 완 성한다. '-I' 는 소문자 cc 를 사용하기 때문에 디렉토리의 일부를 주지 않 는다. Different lists are useful with different commands. > complete alias 'p/1/a/' > complete man 'p/*/c/' > complete set 'p/1/s/' > complete true 'p/1/x:Truth has no options./' 위와 같은 완성은 'alias' 가 있으므로 별명들에서 그리고 'man' 는 명령에 서 그리고 'set' 는 쉘변수에서 단어를 완성한다. 'true' 는 어떤 옵션도 없으 므로 x 옵션은 완성을 시도할 때 아무런 행동도 하지않고 'Truth has no options.' 를 출력한다. man 예에서 'p/*' 만큼이나 'c/*' 또는 'n/*' 도 자주 사용한다는 것에 주 의해라. 또한, 변수를 완성할 수도 있다. 아래의 예를 보아라. > complete ftp 'p/1/$hostnames/' > set hostnames = (rtfm.mit.edu tesla.ee.cornell.edu) > ftp [^D] rtfm.mit.edu tesla.ee.cornell.edu > ftp [^C] > set hostnames = (rtfm.mit.edu tesla.ee.cornell.edu uunet.uu.net) > ftp [^D] rtfm.mit.edu tesla.ee.cornell.edu uunet.uu.net 또, 명령을 실행한 결과를 가지고 완성할 수 있다. 아래 예제를 보아라. > complete kill 'p/*/`ps | awk \{print\ \$1\}`/' > kill -9 [^D] 23113 23377 23380 23406 23429 23529 23530 PID 완성명령은 인수 자체를 인용하지 않으므로 {}와 공백 그리고 '{prrint $1}' 에서 '$' 를 명 백하게 인용해야만 한다는 것에 주의해라. 하나의 완성명령은 다수의 완성을 가질 수 있다. > complete dbx 'p/2/(core)/' 'p/*/c/' 위는 'core' 에서 'dbx' 와 명령에서 모든 다른 인수로 두 번째 인수를 완 성한다. 위치 완성은 다음 단어 완성전에 정의되는 것에 주의하라. 완성은 왼쪽에 서 오른쪽으로 수 행한다. 그러므로 다음 단어 완성이 처음에 정의되었다면 그것은 항상 일치되고 위치 완성 은 결코 실행되지 않을 것이다. 이것은 완 성을 정의할 때 자주 발생하는 실수이다. select 형식은 명령에 인수로서 특별한 형태의 파일을 사용하고자 할 때 사용한다. 예를들어, > complete cc 'p/*/f:*.[cao]/' 와 같은 완성은 'cc' 인자들이 단지 `.c', `.a', 또는 `.o' 로 끝나는 파일들 로 완성된다. 또한, select 는 파일이름치환에 기술된 glob-pattern 에서 사 용하는 제외로 파일들을 제외할 수 도 있다. > complete rm 'p/*/f:^*.{c,h,cc,C,tex,1,man,l,y}/' 위는 'rm' 완성으로부터 소스코드를 제외할 때 사용할 수 있다. 물론 제외 된 이름을 직접 타이프할 수 있고 complete-word-raw 또는 list-choices-raw 편집명령을 사용해서 완성기 능을 무시할 수도 있다. `C', `D', `F' 그리고 `T' list 옵션도 비교적 `c', `d', `f' 그리고 `t' 옵션 과 같으나 그것들 은 특별한 경로로 시작하는 파일들에 대한 완성을 제한 하기위해서 select 인수를 다르게 사용한다. 예를들어 Elm 메일 프로그램은 자신의 메일디렉토리를 위해 약어로 '='를 사용 한다. > complete elm 'c@=@F:$HOME/Mail/@' 위의 완성은 마치 'elm -f ~/Mail/' 인 것처럼 'elm -f =' 을 사용한다. select 인수와 혼란을 피하기 위해서 '/' 대신에 '@' 를 사용하고 홈디렉토 리 치환이 단지 단어의 처음에서 작동하기 때문에 '~' 대신에 '$HOME' 를 사용한다는 것에 주의해라. 접미사는 완성된 단어들에 공백과 '/' 가 아닌 이해할 수 없는 접미사를 추가하기위해서 사 용한다. > complete finger 'c/*@/$hostnames/' 'p/1/u/@' 사용자의 목록으로부터 'finger' 를 위해 인자들을 완성하고 '@' 를 추가하 고 'hostname' 변 수로부터 '@' 뒤에 추가하여 완성한다. 완성을 정의하는 명령을 다시 상기해 보아라. 이제 혼합된 예제를 살펴 보기로 하겠다. > complete find \ 'n/-name/f/' 'n/-newer/f/' 'n/-{,n}cpio/f/' \ 'n/-exec/c/' 'n/-ok/c/' 'n/-user/u/' \ 'n/-group/g/' 'n/-fstype/(nfs 4.2)/' \ 'n/-type/(b c d f l p s)/' \ 'c/-/(name newer cpio ncpio exec ok user \ group fstype type atime ctime depth inum \ ls mtime nogroup nouser perm print prune \ size xdev)/' \ 'p/*/d/' 파일완성은 `-name', `-newer', `-cpio', `ncpio' 그리고 명령완성은 `-exec', `-ok' 그리고 사용자와 그룹 완성은 `user' 와 `group' 주어진 목록 의 요소 완성은 `-fstype', `-type' 형 식의 완성을 정의한다. 또한, 주어진 목록으로부터 c 옵션 완성을 사용하여 자신들의 전환 을 완성하고 어쨌든 디 렉토리도 완성한다. '~' 로 시작되는 치환이나 '$' 로 시작하는 변수이다면 완성이 이것을 무시 한다는 것에 주 의해라. 완성기능은 경험을 많이 해야하고 다음 버전에서는 변경될 수도 있다. 17. continue 가장 가까이에 있는 while 또는 foreach 문을 계속실행한다. 18. default: switch 문에서 내정 case 문의 라벨이다. 이것은 모든 case 라벨뒤에 온 다. 19. dirs [-l] [-n|-v] dirs -S|-L [filename] (+) dirs -c (+) 처음 형식은 디렉토리 스택을 출력한다. 스택의 처음은 왼쪽에 있고 스택 의 첫 디렉토리는 현재 디렉토리이다. -l 옵션은 출력에 있는 '~' 또는 '~name' 는 홈디렉토리 또는 사용자 이름 의 홈디렉토리를 확장한다. -n 옵션은 화면의 끝에 도달하면 입구를 가린 다. -v 옵션은 라인당 하나를 출력 하고 스택 위치보다 선행한다. -l, -n, -v 중에 하나 이상이 주어지면 -v 옵션이 가장 선행 된다. -p 옵션도 사용 되나 아무런 동작도 하지 않는다. 두 번째 형식에서 -S 옵션은 cd 열과 pushd 명령에 의해 파일이름에 디 렉토리 스택을 저 장한다. -L 옵션은 -S 나 savedirs 기능에 의해서 저장 된 디렉토리 스택파일에서 파일이름 으로 가져온다. 파일이름이 주어지지 않 았다면 dirsfile 이 사용되고 dirsfile 가 설정되지 않 았다면 ~/.cshdirs 이 사용된다. 시작시에 로그인쉘은 'dirs -L' 로 시작하고 savedirs 가 설정되었다면 종 료시에 'dirs -S' 를 실행하고 종료한다는 것에 주의하라. 일반적으로 ~/.tcshrc 이 ~/.cshdirs 를 읽기 전에 읽기 때문에 dirsfile 은 ~/.login 에서 설 정하는 것보다는 ~/.tcshrc 에서 설정하는 것이 좋다. 마지막 형식은 디렉토리 스택을 지운다. 20. echo [-n] word ... 쉘의 표준출력에 word 를 출력한다. 공간으로 분리되고 새로운 라인에서 끝난다. echostyle 쉘변수는 플래그와 이스케이프 시퀀스를 에뮬레이트 할지 안할 지를 설정한다. 21. echotc [-sv] arg ... (+) 터미널 특성을 실행한다. 예를들어 'echotc home' 는 커서를 화면의 처음으로 보내고, 'echotc cm 3 10' 는 커서를 10행 3열로 보내고, 'echotc ts 0;echo "This is a test."; echotc fs'는 상태라인에 "This is a test." 를 출력한다. arg 는 'baud', 'cols', 'lines', 'meta', 'tabs' 일 수 있고, 터미널이 그 특 성을 실행할수 있 으면 "yes" 를 실행할 수 없으면 "no"에 해당하는 그 특 성값을 출력한다. 느린 터미널에서 쉘 스크립트에서 오는 메시지를 번거롭게 하지 않기위해 사용하거나 명령 출력이 화면에 표시되는 줄수를 제한하기 위해 사용한다. > set history=`echotc lines` > @ history-- Termcap 문자열은 정확히 나타나지 않는 문자들을 포함할수도 있다. 이 것을 해결하기위해 서 터미널 특성 문자열에 쉘변수를 설정할 때 이중따옴 표(")를 사용하여 해결할 수 있다. > set tosl="`echotc ts 0`" > set frsl="`echotc fs`" > echo -n "$tosl";date; echo -n "$frsl" 위의 예는 상태라인에 날짜를 출력한다. -s 옵션은 존재하지 않는 특성들은 빈공간을 되돌려준다. 이것은 에러를 내는 것보다 나은 방법이다. -v 옵션은 메시지들을 출력한다. 22. else, end, endif, endsw 아래에 있는 foreach, if, switch, and while 문을 참고해라. 23. eval arg ... 쉘에 입력으로 인수들을 취급하고 현재 쉘의 전후관계에서 발생하는 명령 들을 실행한다. 이것은 보통 명령이나 변수치환의 결과로 발생하는 명령들 을 실행하기위해 사용한다. 이것 은 해석이 이러한 치환전에 발생할 때 사용 한다. 예제는 tset 의 예제를 보아라. 24. exec command 지정한 명령을 실행한다. 25. exit [expr] 지정한 expr 값이나 expr 이 없으면 status 변수값으로 쉘을 종료한다. 26. fg [%job ...] 지정된 작업 또는 인수가 없으면 현재 작업을 포그라운드로 실행한다. job 인수는 jobs 에 기술된 숫자나 문자열, `', `%', `+', `-' 이다. run-fg-editor 편집명령을 참고해라. 27. filetest -op file ... (+) File inquiry operators 에 기술한 op 를 각 파일에 적용하여 그 결과를 공백으로 분리해서 출력한다. 28. foreach name (wordlist) ... end wordlist 의 각 요소에 변수 이름을 설정하고 이 명령과 end 사이의 명령 들의 시퀀스를 실 행한다. 루프를 계속하기 위해서 continue 내부 명령을 사용하고 루프를 끝내기 위해 break 내부 명령을 사용한다. 터미널이 이 명령이 읽으면 루프에 있는 어떤 명령이 실행되 기 전에 'foreach? ' 또는 prompt2 를 출력한후에 계속 읽는다. 루프에서 타이핑을 잘못했 다면 그것을 없앨 수 있다. 29. getspath (+) 시스템 실행 경로를 출력한다.(TCF only) 30. getxvers (+) 실험버전 접두사를 출력한다.(TCF only) 31. glob wordlist echo 와 같으나, '\' 이스케이프 시퀀스는 인식하지 못하고 단어는 출력에 널문자들로 한계 를 정한다. 파일이름에서 단어들의 목록을 확장하는 쉘을 사 용하기를 원하는 프로그램들에 서 사용한다. 32. goto word word 는 'label' 형식의 문자열을 만들기위한 파일이름과 치환된 명령이 다. 쉘은 가능하다 면 그것의 입력을 다시 되돌리고 'label:' 형식을 찾고 공 백이나 탭보다 우선하고 그 라인 뒤 실행을 계속한다. 33. hashstat 내부 해쉬 테이블이 위치하는 명령들을 가지는 효과적인 방법을 지정하는 통계적인 라인을 출력한다. exec 는 해쉬 기능이 가능한 히트를 지정하는 path 의 각 구성요소를 시도하고 '/' 로 시작하지 않는 각 구성요소를 시도한 다. vfork 가 없는 시스템에서 단지 해쉬 버켓의 크기를 출력한다. 34. history [-hr] [n] history -S|-L|-M [filename] (+) history -c (+) 처음 형식은 히스토리 목록을 출력한다. n 이 주어지면 n 번째 히스토리 를 출력하거나 저 장한다. -h 옵션은 앞에 히스토리 번호없이 시간으로 히 스토리 목록을 출력한다. -r 옵션은 히스토리를 역순으로 출력한다. 두 번째 형식에서 -S 옵션은 파일이름에 히스토 리 목록을 저장한다. savehist 쉘변수의 첫 인수는 저장 할 히스토리의 목록 수를 지정한다. savehist 의 두 번째 인수가 `merge' 로 설정되어 있으면, 히스토리 목록 을 존재하는 히스 토리 파일에 추가한다. 히스토리를 추가하는 것은 동시에 여러 쉘을 사용하는 X 윈도우 시 스템 환경에서 사용한다. 쉘이 제대로 종료 되었을때에만 가능하다. -L 옵션은 쉘이 -S 옵션이나 savehist 에서 저장된 히스토리 목록인 파 일이름에 히스토리 를 추가한다. -M 옵션은 -L 옵션과 같으나 파일이름의 내용이 히스토리목록에 추가되고 시간으로 정렬한다. 파일이름이 주어지지 않으면 histfile 이 사용되고 histfile 이 설정되지 않았으면 ~/.history 파일 이 사용된다. `history -L' 는 파일이름을 요구하지 않는 것을 제 외하면 'source -h' 와 같다. 로그인 쉘은 시작시에 `history -L' 로 시작하는 것과 같고 savehist 가 설정되어 있으면 종료할 때 `history -S' 를 실행한다. 일반적으로 ~/.tcshrc 을 ~/.history 보다 먼저 읽기 때문에 histfile 은 ~/.login 에서 보 다는 ~/.tcshrc 에서 설정하는 것이 낫다. histlit 가 설정되어 있으면 첫 번째와 두 번째 형식은 히스토리를 출력하 고 히스토리 목록 에 문자 그대로 즉, 확장하지 않은 형식으로 저장한다. 마지막 형식은 히스토리 목록을 지 운다. 35. hup [command] (+) 인수로 command 가 있으면, 고장 시그널을 종료하고 쉘이 종료할 때 고 장 시그널을 보내 기위해 할당하는 것과 같이 명령을 실행한다. 그 자신의 응답에 hup 를 무시하는 문제를 설정한다는 것에 주의해라. 인수가 없으면 쉘이 스크립트의 나머지 고장을 종료한다. 36. if (expr) command expression 에 기술된 expr 이 사실이다면 명령을 실행한다. 명령에서 변수 치환은 미리 일어나고 동시에 if 명령의 나머지를 실행한 다. 명령은 간단한 명령, 별명, 파이프라인, 명령리스트 또는 괄호가 있는 명 령 목록뿐만 아니라 인수를 가질 수도 있다. 입출력 방향전환은 expr 이 거 짓일지라도 명령은 실행되지 않는 결과를 야기한 다. 이것은 버그이다. 37. if (expr) then command ... else if (expr2) then command 2 ... else ... endif 지정된 expr 이 사실이면 명령이 실행되고 그렇지 않으면 첫 번째 else 가 실행되는데 이 때 expr2 가 사실이면 명령 2 가 실행되고 거짓이면 두 번째 else 문이 실행된다. else if 쌍이 많아도 단지 하나의 endif 만이 필요하다. else 부는 옵션이 다. else 와 endif 문은 라인의 처음에 있어야하고 if 문은 라인 처음이나 else 이후에 하나만 있어야한다. 38. inlib shared-library ... (+) 현재 환경에 공유(共有) 라이브러리를 추가한다. 공유 라이브러리를 제거 하는 방법은 없다. 39. jobs [-l] 활성화된 즉, 배경 또는 전경으로 실행중인 작업들의 목록을 출력한다. -l 옵션은 일반적인 정보외에 프로세스 ID 를 출력한다. TCF 시스템에서 는 각 작업이 실 행되고 있는 사이트를 출력한다. 40. kill [-signal] %job|pid ... kill -l 첫 번째형식은 지정된 시그널 또는 지정되어 있지 않으면 TERM(종료) 시그널을 지정된 작업 또는 프로세스에 보낸다. job 은 jobs 에 나타나는 숫자나 문자열, '', '%', '+', '-' 들이 다. 시그널은 숫자로 주어지거나 /usr/include/signal.h 에 기술된 이름중 접두사 'SIG' 를 제외한 이름으로 주 어진다. 기본값은 없으며 단지 'kill' 만을 주면 현재 작업에 시그럴을 보내 지 않는다. 보내려는 시그널이 TERM(종료), HUP(고장) 이다면 작업 또는 프로 세스는 CONT(계속) 시그널을 보낸다. 두 번째 형식은 시그널 이름들을 출력 한다. 41. limit [-h] [resource [maximum-use]] 현재 프로세스와 각 프로세스가 차지하는 양을 제한하고 그것은 지정된 자원에 최대 사용 값(maximum-use)을 넘어서 사용하지 않도록 만든다. 최 대 사용값을 주지 않으면 현재 제 한값을 출력한다. 자원이 주어지지 않으면 모든 제한을 주어진다. -h 옵션이 주어지지 않으면 하드제한을 현재 제한 대신에 사용한다. 하드 제한은 현재 제한 값의 최대값을 준다. 단지 관리자(루트:root)만이 하드제 한을 증가시킬 수 있고 일반 사용 자는 허용범위내에서만 하드 제한을 올리거 나 내릴수 있다. 제어할 수 있는 자원은 각 프로세스에서 사용하는 cpu 초의 최대값을 나 타내는 cputime 과 만들어질 가장 큰 단일 파일의 최대값을 나타내는 filesize, sbrk()에서 데이터+스택 영 역의 최대값을 나타내는 datasize, 자동 적으로 확장되는 스택영역의 최대 크기를 나타내는 stacksize, 만들어질 가 장 큰 core 파일의 최대값을 나타내는 coredumpsize 그리고 프로세 스가 주 어진 시간에 할당할 수 있는 물리적 메모리의 최대값을 나타내는 memoryuse 등이 다. maximum-use 는 크기 요소로 유동 실수 또는 정수를 갖는다. cputime 을 제외한 모 든 제한값들은 기본 단위가 KByte(1024 바이트)이고 MByte를 사용할 수도 있다. cputime 은 기본단위가 초이며 분은 m, 시는 h, 분과 시간을 나타내는 mm:ss 형식을 사용한다. 자원 이름과 크기 요소는 정확한 접두사가 필요하다. 42. log (+) watch 쉘변수를 출력하고 마지막 로그인과 관계없이 watch 에서 지시한 시스템으로 들어 오는 모든 사용자에대해 보고한다. watchlog 를 참고해라. 43. login 로그인쉘을 종료하고 대신에 즉시 /bin/login 으로 대체한다. 이것은 로그 아웃하는 한 방법 을 제공한다. 44. logout 로그인쉘을 종료한다. ignoreeof 가 설정되어 있으면 사용한다. 45. ls -F [-switch ...] [file ...] (+) `ls -F' 은 파일과 디렉토리 목록을 출력한다. 특별한 문자로 특별한 종 류의 파일들을 구 분하여 출력한다. / : 디렉토리. * : 실행 가능한 파일. # : 블록 장치. % : 문자 장치. | : Named pipe (systems with named pipes only) = : Socket (systems with sockets only) @ : 기호 링크(Symbolic link). + : 숨김 속성의 디렉토리(AIX 시스템), context dependent (HP/UX 시스템) : : Network special (HP/UX 시스템) listlinks 쉘변수가 설정되어 있으면 기호링크는 더 자세히 출력된다. @ : 디렉토리가 아닌 기호링크. > : 디렉토리 기호링크. & : 어디에도 기호링크가 되어 있지 않고 단지 파일만 존재. listflags 쉘변수가 `x', `a', `A', 또는 `xA' 과 같이 이들의 조합으로 설 정되어 있으면, 그 것들은 ls -F 의 플래그로서 사용되어서 `ls -xF', `ls -Fa', `ls -FA', `ls -FxA' 와 같이 동작한다. `ls -C' 가 기본값으로 되어 있으면 ls -F 는 `ls -CF' 와 같이 동작하고 listflags 가 'x' 를 포함하면 `ls -xF' 와 같이 동작한다. 어떤 스위치가 있 다면 ls -F 에 인수로 주어지고 일반적으로는 `alias ls ls-F' 로 동작한 다. ls-F 는 파일이름으로 정렬할 때 파일 확인 문자를 포함하는데 이것이 버그이다. 46. migrate [-site] pid|%jobid ... (+) migrate -site (+) 첫 번째 형식은 프로세스 또는 작업을 지정한 사이트 또는 시스템 경로로 정의한 기본 사 이트로 옮긴다. 두 번째 형식은 `migrate -site $$' 와 같다. 이것은 현재 프로세스를 지정 한 사이트로 옮긴다. 쉘 자체를 옮기는 것은 예기치 못한 동작을 일으킬 수 있고 그후에 쉘은 자신의 tty 를 잃어버린 것처럼 동작할 것이다(단지 TCF 에서이다). 47. newgrp [-] group (+) `exec newgrp' 과 같다. 쉘이 그렇게 컴파일되었을때만 작동한다. 48. nice [+number] [command] 숫자 또는 숫자가 없다면 4로 쉘의 우선권을 설정한다. 명령이 있다면 적 절한 우선권으로 명령을 실행한다. 숫자는 프로세스가 얻을 수 있는 가장 낮은 프로세스이다. 관리자는 'nice -number ...' 를 사용하여 우선권을 정 의할 수 있다. 명령은 항상 부 쉘로 실행되고 간단한 if 문을 적용한 명령을 사용할 수 있도록 제한한다. 49. nohup [command] 명령이 있으면 hangup(고장) 시그널을 무시하는 것처럼 명령을 실행한다. 명령에 hangup 에 대한 자신의 응답을 설정할 수 있다는 것에 주의하라. 쉘 스크립트에서 인수가 없이 사 용된다면 나머지 스크립트에서는 hangup 시그 널을 무시한다. 50. notify [%job ...] 쉘에게 지정한 작업 또는 %job 이 없으면 현재 작업의 상태가 변경되었 을 때 다음 프롬프 트를 기다리지 않고 즉시 사용자에게 알리도록 한다. job 은 jobs 에 나타나는 숫자나 문자열 그리고 `', `%', `+', `-' 등이다. as 51. onintr [-|label] 인터럽트에 대한 쉘의 행동을 제어한다. 인수가 없으면 인터럽트에 대해 쉘의 기본 행동을 복구하고 쉘 스크립트를 종료하거나 터미널 명령 입력 상태로 돌아온다. - 옵션이 있으면 모든 인터럽트를 무시한다. label 옵션이 있으면 쉘은 인 터럽트가 발생했 을 때 'goto label' 을 실행하고 인터럽트를 처리하기위해 자 (子) 프로세스를 종료한다. onintr 는 쉘이 분리되어 실행중이거나 시스템에 있는 시작 파일들을 실 행중이거나 인터럽 트가 비활성화되어 있으면 무시된다. 52. popd [-p] [-l] [-n|-v] [+n] 인수가 없으면 디렉토리 스택에서 읽고 새로운 첫 디렉토리를 출력한다. 숫자 '+n' 이 있으 면 스택에서 n 번째 스택을 취소한다. popd 의 모든 형 식은 dirs 와 같이 마지막 디렉토리 스택을 출력한다. pushdsilent 쉘변수로 이것을 금지할 수 있고 -p 플래그는 pushdsilent 를 금지하도록 할 수 있 다. -l, -n, -v 플래그는 dirs 에서와 같은 동작을 수행한다. 53. printenv [name] (+) 모든 환경변수의 이름과 값 또는 name으로 준 환경변수의 값을 출력한 다. 54. pushd [-p] [-l] [-n|-v] [name|+n] 인수가 없으면 디렉토리 스택에서 처음 두 요소를 교환한다. pushdtohome 가 설정되어 있 으면 인수없는 pushd 는 cd 와 같이 'pushd ~' 를 실행한다. name 이 있으면 현재 작업 디렉토리를 디렉토리 스택에 쓰 고 name 으로 변경한다. name 이 '-' 이면 이전 작업 디렉 토리로 해석한 다. dunique 가 설정되어 있으면 pushd 는 스택에 그것을 쓰기 전에 스택으 로 부터 name 을 제거한다. 숫자 '+n' 이 있으면 디렉토리 스택에서 n 번째 요소를 처음요 소와 교환하고 그곳으로 변경한다. 그러나 dextract 가 설정 되어 있으면 'pushd +n' 은 n 번째 디렉토리를 빼내서 스택의 처음으로 보내 고 그곳으로 변경한다. pushd 의 모든 형식은 dirs 와 같이 마지막 디렉토리를 출력한다. pushdsilent 쉘변수가 설 정되어 있으면 이것을 금지하고 -p 옵션으로 pushdsilent 를 금지할 수 있다. -l, -n, -v 플래그는 dirs 에서와 같은 동작 을 수행한다. 55. rehash path 변수에 있는 디렉토리 내용의 내부 해쉬 테이블을 다시 읽는다. 이 것은 로그인된 후 에 새 명령이 있는 디렉토리를 path 에 추가했을 때 사 용한다. 이것은 단지 자신의 디렉토 리에 중 하나에 명령을 추가하거나 시 스템 디렉토리 중에 하나의 내용이 변경되었을 경우 에만 필요하다. 또한 '~' 기호를 포함하는 홈디렉토리의 캐쉬를 갱신할 수도 있다. 56. repeat count command 한 라인에 if 문에서 기술한 명령의 제한을 갖는 지정한 명령들을 count 횟수만큼 실행한 다. 입출력 리다이렉션은 count 가 0일지라도 적어도 한 번 은 실행된다. 57. rootnode //nodename (+) 루트 노드를 //nodename 으로 변경한다. 그러므로 `/' 는 `/nodename' 으 로 해석된다. (단지 Domain/OS 에서만 사용가능하다.) 58. sched (+) sched [+]hh:mm command (+) sched -n (+) 첫 번째 형식은 예정된 작업목록을 출력한다. 예정 작업목록을 출력하는 형식을 정의하기 위해서 sched 쉘변수를 설정한다. 두 번째 형식은 예정 작업 목록에 command 를 추가한다. 예를 들어, > sched 11:00 echo It\'s eleven o\'clock. 와 같이 설정하면 쉘은 오전 11시에 `It's eleven o'clock.' 를 출력할 것 이다. 그리고 오전/ 오후 형식의 시간으로 설정할 수도 있고 현재 시간과 비 교하여 설정할 수도 있다. 그러나 비교 시간 형식은 오전/오후 형식을 사 용할 수 없다. > sched 5pm set prompt='[%h] It\'s after 5; go home: >' > sched +2:15 /usr/lib/uucp/uucico -r1 -sother 세 번째 형식은 예정 작업목록으로부터 n 번째 작업을 제거한다. > sched 1 Wed Apr 4 15:42 /usr/lib/uucp/uucico -r1 -sother 2 Wed Apr 4 17:00 set prompt=[%h] It's after 5; go home: > > sched -2 > sched 1 Wed Apr 4 15:42 /usr/lib/uucp/uucico -r1 -sother 예정 작업목록의 명령은 그 예정된 시간에 첫 프롬프트가 출력되기 전에 실행된다. 명령이 실행중 일때에는 정확한 시간을 놓칠 수도 있지만 그 명 령은 다음 프롬프트에 실행될 것이 다. 쉘이 사용자 입력을 기다리게 되는 즉시 실행된다. 그러나 예정 명령을 실행하기위해서 정상적으로 실행하는 명령에 인터럽트를 걸지 않는다. 이 기능은 일부 Unix 시스템의 at 명령 과 같다. 이 기능의 주요 목적은 지정된 시간에 명령을 실행하는 것이고 sched 는 쉘로 부터 직접 접근하므로 쉘변수와 다른 기능을 액세스할 수 있다. 또한, 이것은 시간에 기초한 자신의 작업 환경을 변경할 수 있는 기능을 제공한다. 59. set set name ... set name=word ... set name=(wordlist) ... set name[index]=word ... set -r (+) set -r name ... (+) set -r name=word ... (+) set -r name=(wordlist) ... (+) 첫 번째 형식은 모든 쉘변수의 값을 출력한다. 한 단어 이상을 포함하는 쉘변수들은 ()로 둘려쌓인 단어 목록으로 출력된다. 두 번째 형식은 name 을 널문자로 설정한다. 세 번째 형식은 name 에 한 단어를 설정한다. 네 번째 형식은 name 에 wordlist 에 있는 단어의 목록을 설정한다. 모든 경우에 값 은 명령과 파일이름의 확장이다. 다섯 번째 형식은 name 의 index 번째 요소에 word 를 설정하며 이 요 소들은 이미 존재 해야한다. 여섯 번째 형식은 단지 읽을 수만 있는 모든 쉘 변수의 이름만을 출력한다. 일곱 번째 형식은 값을 가지고 있든지 없든 지 name 을 읽을 수만 있게 한다. 일곱형식은 name 에 널문자열을 할당한 다. 여덟 번째와 아홉번째 세 번째와 네 번째 형식과 같으나 name 을 읽을 수만 있게한다. 이런 인수들은 단순히 여러 변수들을 읽기만 가능과 설정가능을 반복할 수 있다. name 과 word 를 '=' 이나 공백으로 분리할 수 있으나 다른 것으로는 할 수 없다. unset 내부명령을 참고해라. 60. setenv [name [value]] 인수가 없다면 모든 환경변수의 이름과 값을 출력한다. name 주어지면 환경변수 name 에 value 나 value 가 없으면 널 문자열을 설정한다. 61. setpath path (+) setpath와 같다(단지 Mach 에서만 사용가능). 62. setspath LOCAL|site|cpu ... (+) 시스템 실행 경로를 설정한다(단지 TCF 에서만 사용가능). 63. settc cap value (+) termcap 에 정의된 터미널 특성이 value 값을 가지고 있다고 쉘에게 알린 다. 터미널 사용 자들이 최종 오른쪽 열을 적당히 가리기 위해 'settc xn no' 를 사용한다. 64. setty [-d|-q|-x] [-a] [[+|-]mode] (+) 쉘이 tty 모드를 변경하지 못하도록 제어한다. -d, -q, -x 옵션은 tty 모 드가 'edit', 'quote', 'execute' 설정이 동작하도록 setty 에게 알린다. 이러한 옵션이 없으면 기본적으로 'execute' 가 사용되도록 되어 있다. 다 른 인수가 없으면 setty 는 활성(+mode) 또는 비활 성(-mode) 로 고정되 어 선택된 설정에 있는 모드를 출력한다. 사용가능 모드는 시스템마다 다르 다. -a 옵션이 있으면 tty 가 고정되어 있든 아니든 선택된 설정사항에 있는 모 든 tty 모드를 출력한다. +mode, -mode 또는 mode 는 mode 를 활성화 (on) 하거나 비활성화(off) 그리고 선택한 설정에서 mode 로부터 제어를 옮 긴다. 예를들어 'setty +echok echoe' 는 쉘이 명령들을 실행할때에 'echok' 를 활성화하고 명령들 이 'echoe' 모드가 활성화 또는 비활성화를 변경할 수 있 도록 인정한다. 65. setxvers [string] (+) 문자열 string 에 실험버전 접두사를 설정하거나 문자열 string 이 없다면 제거한다. 단, TCF 에서만 사용가능. 66. shift [variable] 인수가 없으면 argv[1] 을 취소하고 argv 의 인수를 왼쪽으로 이동한다. argv 가 설정되어 있지 않거나 한 인수보다 작다면 에러이다. 변수 varriable 이 있다면 varriable 에 있는 같 은 기능을 수행한다. 67. source [-h] name [args ...] 쉘은 name 으로부터 명령들을 읽고 실행한다. 명령들은 히스토리 목록에 위치하지 않는다. args 를 주면 argv 에 위치한다. source 명령들은 보금자 리를 만들게 된다. 너무 깊게 보금 자리를 만들면 쉘은 파일 서술자 밖에 서 실행될 수도 있다. 어느 단계에 있는 source 에서 에러가 있으면 모든 source 명령들을 종료한다. -h 옵션은 명령들이 'history -L' 처럼 히 스토 리 목록에 위치한다. 68. stop %job|pid ... 백그라운드로 실행되는 지정된 작업이나 프로세스를 멈춘다. job 은 jobs 에 기술된 숫자, 문자열, `', `%', `+', `-' 이다. 어떤 기본 job 을 가지지 않 고 현재 작업을 멈추지도 않고 단지 'stop' 만을 출력한다. 69. suspend 마치 ^Z 와 같은 정지 시그널을 보내것처럼 쉘을 멈춘다. 이것은 su 에 의해서 실행된 쉘 을 멈추기위해 사용한다. 70. switch (string) case str1: ... breaksw ... default: ... breaksw endsw 처음 명령과 확장된 파일이름으로 지정된 문자열 string 에 대해서 각 case 라벨과 연속적 으로 일치된다. 파일 메타문자인 `*', `?', `[...]' 도 case 라벨에서 사용할 수 있고 변수를 확장할 수도 있다. default 라벨전에 일치하 는 case 라벨이 없다면 default 라벨을 실행한 다. case 와 default 라벨은 각 라인의 처음부터 시작해야한다. breaksw 명령은 endsw 이 후를 계속 실행한다. 즉 switch() 문을 끝낸다. 다른 경우에는 다음 case 라벨을 실행하게 된다는 것에 주의해라. default 라벨도 없고 일치하는 case 라벨도 없으면 endsw 이후를 계속 실행하게 된다. 71. telltc (+) 모든 터미널의 특성들의 값을 출력한다. 72. time [command] 별명, 파이프라인, 명령목록, 괄호로된 명령목록이 아닌 단순한 명령을 실 행하고 time 변수 에 기술된 형식으로 시간 합계를 출력한다. 필요하다면 외부 쉘에 명령을 종료했을 때 시 간을 출력할 수 있다. command 가 없으면 현재 쉘과 자(子) 프로그램의 시간 총계를 출력 한다. 73. umask [value] 파일 만들기 마스크를 8진수로 주어진 value 값으로 설정한다. 일반적으 로 마스크 값은 그 룹은 쓰기, 읽기, 실행 모두 할 수 있고 다른 사용자는 읽고 실행할 수만 있게 하기 위한 002 이거나 그룹과 다른 사용자 모두 읽고 실행할 수만 있게 하기 위해 022 을 사용한다. 만약 value 값이 없으 면 현재 파일 만들기 마스크를 출력한다. 74. unalias pattern pattern 과 일치하는 모든 별명들을 제거한다. `unalias *' 는 모든 별명들 을 지운다. unalias 는 어떤 에러도 내지 않는다. 75. uncomplete pattern (+) pattern 과 일치하는 이름을 가진 모든 완성을 제거한다. `uncomplete *' 는 모든 완성을 제거한다. uncomplete 는 어떤 에러 메시지도 내지 않는다. 76. unhash 실행되는 프로그램들의 위치를 향상시키기 위해서 내부 해쉬 테이블의 사 용을 없앤다. 77. universe universe (+) universe 를 universe 로 설정한다. 단, Masscomp/RTU 에서만 사용가능. 78. unlimit [-h] [resource] 자원 제한을 제거한다. 지정된 자원이 없으면 모든 자원 제한이다. -h 옵 션은 응답하는 하 드 제한들을 제거한다. 단지, 수퍼 유저만이 사용할 수 있다. 79. unset pattern 읽기 전용 변수가 아니면 pattern 과 일치하는 이름을 가진 모든 변수를 제거한다. `unset *' 는 읽기 전용 변수가 아니면 모든 변수를 제거한다. 이것은 좋 지 않은 생각이다. unset 는 어떤 에러 메시지도 출력하지 않는다. 80. unsetenv pattern pattern 과 일치하는 이름을 가진 환경변수를 제거한다. `unsetenv *' 는 모든 환경변수를 제거한다. unsetenv 는 어떤 에러 메시지도 출력하지 않 는다. 81. ver [systype [command]] (+) 인수가 없으면 SYSTYPE 를 출력한다. systype 이 있으면 SYSTYPE 를 systype 으로 설정한다. systype 와 command 를 주면, systype 하에 서 명령을 실행한다. systype 은 `bsd4.3' 또는 `sys5.3' 이다. 단, Domain/OS 에서만 사용가능. 82. wait 쉘은 모든 백그라운드 작업들을 대기하게 한다. 쉘이 상호작용하는 것이 면 인터럽트는 대 기를 분열하고 쉘이 이름과 모든 중요한 작업수들을 출 력할 것이다. 83. warp universe (+) universe 를 universe 로 설정한다. 단, Convex/OS 에서만 사용가능. 84. watchlog (+) log 내장 명령을 위한 다른 이름. 쉘이 그렇게 컴파일되었을 경우에만 사 용가능하다. 85. where command (+) 별명을 내포하고 내부 또는 path 에서 실행할 수 있는 명령의 모든 알려 진 보기를 출력한 다. 86. which command (+) 치환이나 경로를 찾은 후에 쉘에 의해서 실행되어질 명령을 출력한다. 내 부 명령은 which 와 같으나 tcsh 별명과 내부 그리고 10에서 100배정도 빠르고 정확하게 작동한다. 87. while (expr) ... end Expression 에 기술된 expr 이 제로가 아닐때까지 while 과 end 사이에 명령들을 실행한 다. while 과 end 는 입력라인에 혼자 있어야한다. bread 와 continue 는 일시적으로 루프 를 종료하거나 계속하고자 할 때 사용한다. 터 미럴에서 입력한다면 사용자는 foreach 와 같이 루프의 처음시작시에 프롬 프트를 받을 것이다. XX. 특별한 별명(SPECIAL ALIAS) 설정한다면 이 별명들은 지정된 시간에 자동적으로 실행된다. 처음에 이것들 은 모두 정의되어 있지 않다. 1. beepcmd 쉘이 터미널 벨을 울리기를 원할 때 실행된다. 2. cwdcmd 작업디렉토리가 변경될 때 실행된다. 예를들어 사용자가 xterm 과 twm 과 같이 타이틀바를 지원하는 윈도우 관리자를 사용하 여 X 윈도우에서 작업중이라면, > alias cwdcmd 'echo -n "^[]2;${HOST}:$cwd^G"' 라고 실행한다면 쉘은 호스트, 콜론 그리고 작업중인 디렉토리의 전체 경 로를 실행중인 xterm 의 타이틀바를 변경할 것이다. > alias cwdcmd 'echo -n "^[]2;${HOST}:$cwd^G^[]1;${HOST}^G"' 과 같이 실행하는 것이 일반적이다. 이것은 타이틀바에 호스트이름과 작 업디렉토리로 변경 한다. cwdcmd 에 cd, pushd 또는 popd 를 주는 것은 무 한 루프를 일으킨다는 것에 주의 하라. 3. periodic tperiod 에 정의된 시간마다 실행한다. 이것은 새로운 메일과 같이 드물게 변경되는 작업을 점검하는 편한 방법을 제공한다. 예를들어 > set tperiod = 30 > alias periodic checknews 위와 같이 실행하면 checknews 는 매 30분마다 실행된다. 그러나 periodic 이 설정되고 tperiod 이 설정되지 않았거나 0으로 설정되 어 있다면, periodic 은 precmd 처럼 동작한다. 4. precmd 프롬프트가 출력되기 전에 실행한다. 예를들어 > alias precmd date 위와 같이 실행하면 date 는 쉘이 프롬프트를 출력하기 전에 실행된다. precmd 가 어떻게 설정되어도 상관이 없지만 신중히 사용해야한다. 5. shell 실행할 수 있는 스크립트가 자체적으로 정의하지 않은 명령해석기를 정의 한다. 첫 인수로 `/bin/csh' 또는 `/usr/local/bin/tcsh' 와 같이 원하는 쉘을 준 다. XX I. 쉘 변수 II 쉘에 특별한 의미를 주는 변수들에 대해 기술한다. 쉘은 스타트업시에 addsuffix, argv, autologout, command, echostyle, edit, gid, group, home, loginsh, oid, path, prompt, prompt2, prompt3, shell, shlvl, tcsh, term, tty, uid, user, version 들을 설정할 수 있다. 이 변수들은 사용자 가 변경하지 않는다면 후에 변경되지 않는다. 쉘은 필요하다면 cwd, dirstack, owd, status 변수를 갱신고 로그아웃에서 logout 을 설정한다. 쉘은 afsuser, group, home, path, shlvl, term, user 를 같은 이름의 환경변수 와 동기화한다. 환경변수들이 변할때는 쉘은 변수가 읽기 전용이 아니면 그에 반응하는 쉘변 수를 변경한다. cwd 와 PWD 는 같은 의미를 가지고 있지만 이 방법으로 동기화되지 않는 것과 쉘이 자동적 으로 path 와 PATH 를 다른 형식으로 변경하는 것에 주의 하라. 1. addsuffix (+) 설정한다면 파일이름 완성은 정확하게 완성되었을 때 디렉토리의 끝에는 '/' 를 파일이름의 끝에는 공백을 추가한다. 기본적으로 설정되어있다. 2. afsuser (+) 설정한다면 autologout's autolock 기능은 kerberos 확증을 위해 로컬 사 용자이름 대신에 그것을 사용한다. 3. ampm (+) 설정한다면 모든 시간을 AM/PM 형식으로 보여준다. 4. argv 쉘에 인수를 준다. 위치 파라미터들은 argv 로 부터 주어진다. 즉, `$1' 은 `$argv[1]' 로 대치된다. 기본적으로 설정되어 있으나 일반적으로 상호 작용하는 쉘은 설정되어 있지 않다. 5. autocorrect (+) 설정한다면 spell-word 편집기 명령은 자동적으로 철자 완성전에 실행된 다. 6. autoexpand (+) 설정한다면 expand-history 편집 명령은 자동적으로 완성 시도전에 자동 적으로 실행된다. 7. autolist (+) 설정한다면 가능성들은 애매한 완성후에 출력된다. `ambiguous' 로 설정 한다면 가능성들은 단지 새로운 문자들이 완성에 의해서 더해지기 없을 때 출력한다. 8. autologout (+) 첫단어는 자동적으로 로그아웃되기전에 정지할 시간이며 단위는 분(分)이 다. 선택적으로 두 번째 단어는 자동적으로 잠그기전에 정지할 시간이며 단위 는 분(分)이다. 쉘이 자동적으로 로그아웃될 때 `auto-logout' 을 출력한다 `automatic' 로그아웃 변수를 설정하고 종료한다. 쉘이 자동적으로 잠글 때 사용자에게 작업을 계속하기위해 사용자의 비밀번호를 입력하도록 한다. 암호를 다섯 번 잘못 입력하면 자동적으로 로그아웃된다. 로그인시에 60 분후에 자동적으로 로그아웃되도록 기본값으로 60 이 설정 된다. 그러나 윈 도우 시스템에서 실행중이거나 즉, DISPLAY 환경변수가 설 정되어 있거나 tty 가 pseudo-tty (pty) 이거나 쉘이 그렇게 컴파일 되었다면 작동하지 않는다. afsuser 와 logout 쉘 변수를 참고하라. 9. backslashquote (+) 설정한다면 백슬래쉬(\) 는 항상 `\', `'', 그리고 `"' 를 인용한다. 이것은 복잡한 인용작업 을 더 쉽게 할 수 있으나 csh 스크립트에서는 에러가 나온 다. 10. cdpath cd 명령이 현재 디렉토리에 서브 디렉토리가 존재하지 않는다면 서브 디 렉토리를 찾기위 한 경로를 지정한다. 11. command (+) 설정한다면 -c 플래그로 쉘을 통과하기위한 명령을 설정한다. 12. complete (+) `enhance' 로 설정된다면 단어 완성기능은 대소문자를 무시하고 단어 분 리자로 마침표(.), 하이픈(-) 그리고 밑줄()로 취급하고 하이픈(-)과 밑줄() 은 같은 것으로 취급한다. 13. correct (+) `cmd' 로 설정한다면 자동적으로 명령들의 철자를 정정한다. `complete' 로 설정한다면 자 동적으로 명령들을 완성한다. `all' 로 설정한다면 전체 명령 라인을 정정한다. 14. cwd 현재 디렉토리의 전체 경로를 출력한다. dirstack 그리고 owd 쉘 변수를 참고해라. 15. dextract (+) 설정한다면 `pushd +n' 처음에서 그것을 순환하는 것보다도 디렉토리 스 택으로 부터 n 번째 디렉토리로 부터 끌어낸다. 16. dirsfile (+) `dirs -S' 그리고 `dirs -L' 는 히스토리 목록을 찾을 기본 위치를 지정한 다. 설정하지 않 는다면 ~/.cshdirs 를 사용한다. 일반적으로 ~/.cshdirs 를 읽 기전에 ~/.tcshrc 를 읽기 때문 에 ~/.cshdirs, dirsfile 는 ~/.login 보다는 ~/.tcshrc 에서 설정한다. 17. dirstack (+) 디렉토리 스택에 있는 모든 디렉토리들의 배열이다. `$dirstack[1]' 는 현재 작업 디렉토리이다. `$dirstack[2]' 는 스택에 있는 첫 번째 디렉토 리이다. 현재 작업 디렉토리는 `$dirstack[1]' 이지만 디렉토 리 스택 치환에서는 `=0' 이다 는 것에 주의해라. dirstack 을 설정해서 마음 대로 스택을 변경할 수 있으나 첫 번째 원소 는 항상 현재 작업 디렉토리 로서 정확하다. cwd 와 owd 쉘 변수를 참고해라. 18. dunique (+) 설정한다면 pushd 는 스택에서 그것을 집어넣기전에 이름 예를 제거한다. 19. echo 설정한다면 인수를 가진 명령은 그것이 실행되기전에 화면에 나타낸다. non-builtin 명령을 위해서는 모든 확장들은 출력되기전에 발생한다. Builtin 명령들은 명령 과 파일이름치환전에 출력된다. 이런 치환들이 선택 적으로 실행한다. -x 명령 라인 옵션에의해 설정한다. ※ echostyle (+) ① bsd : 첫 인자에 `-n' 이 있다면 newline 을 출력하지 않는다. ② sysv : 에코우 문자열에 있는 백슬래쉬(\) 이스케이프 문자를 인식 한다. ③ both : ① 과 ② 둘다 인식하며 기본값이다. ④ none : ① 과 ② 어떤 것도 인식하지 않는다. BSD 와 System V 옵션은 echo 도움말을 참고해라. 20. edit (+) 설정한다면 명령라인 편집기를 사용한다. 상호작용하는 쉘은 기본적으로 설정된다. 21. ellipsis (+) 설정한다면 `%c'/`%.' 그리고 `%C' 프롬프트 열 지시자는 /skiped 대신 에 생략부호(...)로 디렉토리들을 건너뛴다. 22. fignore (+) 단어완성에 의해서 무시될 파일확장자의 목록을 지정한다. 23. filec tcsh 에서는 단어완성은 항상 사용되고 이 변수들은 무시된다. csh 에서 설정한다면 파일 완성을 사용한다. 24. gid (+) 사용자의 실제 그룹 ID. 25. group (+) 사용자의 그룹이름. 26. histchars 문자들을 결정하는 문자열 값은 히스토리 치환에서 사용한다. 그 값의 첫 문자는 히스토리 치환 문자로 사용한다. 내정문자는 '!'이다. 그 값의 두 번째 문자는 빠른 치환에서 '^' 문자로 대치한다. 27. histdup (+) 히스토리 목록에 이중 엔트리 처리를 제어한다. 'all' 로 설정한다면 히스토리는 히스토리 목록에 삽입한다. 'prev' 로 설정 한다면 마지막 히 스토리는 현재 명령과 같다. 현재 명령은 히스토리에 삽 입되지 않는다. 'erase' 로 설정한다 면 같은 사건은 히스토리 목록에서 찾 는다. 과거 사건들은 삭제하고 현재 사건은 삽입한다. 28. histfile (+) `history -S' 그리고 `history -L' 로 히스토리 파일을 찾을 기본 위치를 설정한다. 설정하지 않는다면 ~/.history 가 사용한다. histfile 은 다른 기계들 사이 에서 같은 홈디렉 토리를 공유할때나 다른 터미널들에서 다른 히스토리를 사용할 때 사용한다. 일반적으로 ~/.tcshrc 는 ~/.history 전에 읽기 때문에 histfile 은 ~/.login 에 설정하는 것보 다 ~/.tcshrc 에 설정하는 것이 낫다. 29. histlit (+) 설정한다면 builtin 과 편집명령들 그리고 save-histt 메카니즘은 use the literal 히스토리 목록에서 라인들의 확장되지 않는 문자 형식을 사용한다. toggle-literal-history 편집명령을 참고해라. 30. history 첫 번째 단어는 저장할 히스토리 수를 지정한다. 선택적으로 두 번째 단 어는 히스토리를 출력하는 형식을 지정한다. 주어지지 않는다면 `%h\t%T\t%R\n' 를 사용한다. 형식 문자 열은 prompt 하에서 기술한다. `%R' 변수가 의미하는 것을 주의해라. 기본값으로 100 으로 설정된다. 31. home 홈디렉토리를 지정한다. `~' 의 파일확장은 이 변수를 참조한다. 32. ignoreeof If set to the empty string or `0' and the input device is a terminal, 빈 문자열이나 '0' 그리고 입력장치를 설정한다면 터미널이다. 일반적으로 빈 라인에서 '^D' 를 타이핑함으로서 발생하는 end-of-file 명 령은 탈출하는 대 신에 `Use "exit" to leave tcsh.'를 출력하도록 한다. 이 것은 쉘이 뜻하지 않게 죽는 것을 막는다. 숫자 n 이 설정된다면 쉘은 연 속적인 end-of-file 을 무시하고 n 번째에서 종료한 다. 설정되지 않는다면 `1' 을 사용한다. 즉 쉘은 단지 '^D' 로만 종료한다. 33. inputmode (+) `insert' 나 `overwrite' 로 설정한다면 편집기를 시작할 입력모드를 설정 한다. 34. listflags (+) `x', `a' 또는 `A', 또는 `xA' 과 같은 조합으로 설정한다면, 그것들은 ls -F 에서 처럼 플 래그로서 사용되고 `ls -xF', `ls -Fa', `ls -FA' 그리고 `ls -FxA' 와 같이 조합으로서 사 용할 수 있다. 'a' 는 히든파일('.'으로 시작하는 파일)을 포함한 모든 파일을 보여준다. `A' 는 '.', '..' 로 시작되는 히든파일 을 제외한 모든 파일을 보여준다. `x' 는 역순으로 정렬하여 보여준다. 만 약 list 플래그의 두 번째 단어가 설정된다면 ls 의 경로로서 사용한다. 35. listjobs (+) 설정한다면 작업이 지연될 때 모든 작업들은 목록화된다. `long'이 설정한 다면, 목록은 긴 형식을 사용한다. 36. listlinks (+) 설정한다면 ls -F builtin 명령은 기호 링크 포인트에 파일의 타입을 보여 준다. 37. listmax (+) 아이템의 최대수를 설정하면 list-choices 편집명령이 질문없이 출력한다. 38. listmaxrows (+) The maximum number of rows of items which the list-choices editor command will list without asking first. 아이템의 최대 열을 설정한다면 list-choices 편집 명령은 질문없이 출력 한다. 39. loginsh (+) 로그인 쉘을 설정한다. 쉘에서 설정하거나 설정하지 않거나 아무런 효과 가 없다. shlvl 을 참고해라. 40. logout (+) 정상적인 로그아웃전에 'normal' 로 설정되고 자동 로그아웃전에 `automatic' 으로 설정되 고 만약 쉘이 비정상적으로 종료되었다면 `hangup' 으로 설정된다. autologout 쉘변수를 참고하라. 41. mail 들어온 메일을 검사하기 위한 공백으로 분리된 파일이름과 디렉토리 이름 과 선택적으로 숫 자를 사용한다. 각 프롬프트전에 마지막 검사후에 10 분 이 지난다면 쉘은 각 파일을 점검 하고 `You have new mail.' 을 출력한다. 만약 메일이 여러개의 파일들을 포함하고 있다 면 `You have new mail in name.' 을 출력한다. 파일 크기가 0 보다 크다면 갱신 시간은 액세스 시간 보다 더 크다. 로그인 쉘이다면 쉘이 시작된 후에 갱신된 것이 없다면 보고하지 않는다. 대부분의 로그인 프로그램들은 로그인시 메일이 있는지 없는지를 출력해 준다. mail 에 정의된 파일이 디렉 토리이다면 쉘은 그 디렉토리 안에 있 는 각 파일을 센후 적절하게 `You have n mails.' 또 는 `You have n mails in name.' 를 출력해 준다. 이 기능은 주로 Adrew Mail System 과 같이 메일을 저장하는 시스템에서 사용한다. mail 첫 번째에 숫자가 있으면 다른 메일 을 점검하는 기간이다. 단위는 초이다. 매우 드문 상황으로 쉘은 `You have mail.' 대신에 `You have new mail.' 를 출력한다. 42. matchbeep (+) `never' 로 설정한다면 완성은 결코 경고음을 내지 않는다. `nomatch' 로 설정한다면, 단지 일치하는 것이 없을때만 경고음을 낸다. `ambiguous 로 설정한다면, 여러개가 일치할때만 경고음을 낸다. `notunique' 로 설정한다 면, 하나가 일치하고 더 이상 일치하지 않을때만 경고음을 낸다. 아무것도 설정하지 않으면 `ambiguous' 이 사용된다. 43. nobeep (+) 설정한다면 경고는 비활성화한다. visiblebell 을 참고해라. 44. noclobberr 설정한다면 제한들은 출력 리다이렉션이 사고로 파일들을 파괴하지 않도 록 보호한다. 입출력 섹션에 기술한 `>>' 리다이렉션들은 존재하는 파일에 덧붙인다. 45. noglob 설정한다면 파일이름 치환과 디렉토리 스택 치환을 금지한다. 이것은 파 일이름을 다루지 않는 쉘 스크립트에서 가장 유용하고 파일이름의 목록을 얻은 다음에 확장되지는 않는다. 46. nokanji (+) 설정한다면 쉘은 Kanji 를 지원한다. 메타 키를 사용할 수 있도록 비활성 화한다. 47. nonomatch 설정한다면 존재하는 파일과 일치하지 않는 파일이름 치환 또는 디렉토리 스택 치환은 에 러를 일으키는 것보다 오히려 언급하지 않는 것이 낫다. 그 리고 여전히 치환이 잘못 만들 어지는 에러가 있다. 즉 'echo [' 는 여전히 에 러를 낸다. 48. nostat (+) 완성 수행중에 명시하지 않은 디렉토리들 또는 디렉토리들과 일치하는 전 체 패턴의 목록. 보통 이것은 예를들어 /afs 와 같이 많이 소요되는 디렉토리들을 제외하 기 위해 사용한다. 49. notify 설정한다면 쉘은 즉각적으로 작업 완료를 알려준다. 기본적으로 프롬프트 를 출력하기전에 단지 현재 작업 완료이다. 50. oid (+) 사용자의 실제 ID. 단지 Domain/OS 에서만 사용된다. 51. owd (+) cd 와 pushd 에서 사용하는 '-' 와 같이 예전 작업 디렉토리이다. cwd 와 dirstack 쉘변수를 참고해라. 52. path 실행 가능한 명령들을 찾기위한 디렉토리들의 목록을 나열한다. 널 문자는 현재 디렉토리를 정의한다. path 변수에 아무것도 없다면 완전 경로명으로 실행 해야한다. path 는 PATH 환경변수로부터 스타트업에서 쉘 에 의해서 설정되거나 PATH 가 존재하지 않는다면 `(/usr/local/bin /usr/bsd /bin /usr/bin .)' 와 같이 시스템에 의존해 서 기본값으로 설정된 다. 쉘은 첫 번째로 `.' 이고 마지막으로 path 에 있는 경로이며 어떻 게 컴 파일되었느냐에 의존해서 그것을 생략한다. version 쉘변수를 참고해라. -c 나 -t 옵션이 주어지지 않은 쉘은 ~/.tcshrc 를 읽은 후에 path 에 있 는 디렉토리들의 내용을 다시 읽고 매번 path 는 재설정된다. 쉘이 활성화되어있는 동안 새 명령이 path 에 디렉토리를 더한다면 쉘이 그것을 알기위해 서 다시 읽어야할 필요가 있다. 53. printexitvalue (+) 설정한다면 상호작용하는 프로그램은 0 이 아닌 상태로 종료된다. 쉘은 `Exit status' 를 출력한다. 54. prompt ① %/ 현재 작업 디렉토리. ② %~ 현재 작업 디렉토리. 단, 자신의 홈디렉토리이면 `~' 로 표시하고 다른 사용자의 홈디렉 토리이면 `~user' 로 표시한다. ③ %c[[0]n], %.[[0]n] 현재 작업디렉토리의 trailing component 또는 숫자 n 을 준다면 n trailing components n 이 0 으로 시작된다면, 스킵되는 components 의 수는 `/trailing' 형식에 있는 trailing components 보다 우선이다. ellipsis 쉘변수가 설정되어 있다면 스킵된 components 는 ellipsis 에 의해서 표현된다. 그래서 전제가 `...trailing' 된다. `~' 치환은 위의 %~ 와 같이 작동하지만 `~' component 는 trailing components 를 셀 때에는 무시된다. ④ %C %c 와 같으나, ~ 치환이 없다. ⑤ %h, %!, ! 현재 히스토리 작업의 번호. ⑥ %M 전체 호스트 이름. ⑦ %m 첫 번째 '.' 까지의 호스트 이름. ⑧ %S (%s) 표준 문자 모드 시작(%S)과 끝(%s). ⑨ %B (%b) 굵은 문자 모드 시작(%B)과 끝(%b). ⑩ %U (%u) 밑줄 문자 모드 시작(%U)과 끝(%u). %t, %@ AM/PM 형식의 시간. %T 24시간 형식의 시간. %p AM/PM 형식의 시간. %T 보다 자세히 출력. %P %p 와 같으나 ampm 쉘 변수에서 볼수 없음. \c c is parsed as in bindkey. ^c c is parsed as in bindkey. %% `%' 기호. %n 사용자 이름. %d 요일 형식으로 출력. %D %d 에서와 같으나 날짜로 출력. %w 영문약자로된 월로 출력. %W 숫자로된 월로 출력. %y yy 형태로 년을 출력. %Y yyyy 형태로 년을 출력. %l 현재 쉘의 tty를 출력. %L 프롬프트의 끝에서 디스플레이의 끝 또는 라인의 끝까지 지운다. %# 일반 사용자는 `>' 또는 promptchars 쉘변수에서 첫 문자, 수퍼유저는 `#' 또는 promptchars 쉘변수에서 지정한 두 번째 문자. %{string%} 시퀀스로 문자열을 포함한다. 단지 터미널의 속성을 변경할때만 사용 해야하고 커서의 위치를 옮겨서는 안된다. 또한 프롬프트의 마지막 시 퀀스로 사용할 수 없다. %? 프롬프트전에 실행된 명령의 리턴 코드. %R prompt2 에서는 parser 의 상태. prompt3 에서는 정정된 문자열. history 에서는 히스토 리 문자열이다. `%B', `%S', `%U' 그리고 `%{string%}' 는 8비트 쉘에서만 사용가능하 다. bold, standout 그리고 underline 문자열은 종종 수퍼유저 쉘과 구별하기 위해서 사용한다. 예를들어서 > set prompt = "%m [%h] %B[%@]%b [%/] you rang?" 로 설정한다면 프 롬프트는 tut [37] [2:54pm] [/usr/accts/sys] you rang? 가 될 것이다. 55. prompt2 (+) while 과 foreach 에서 사용할 프롬프트. 기본적으로 `%R? ' 로 설정되어 있다. 56. prompt3 (+) 자동 철자정정을 확인할 때 사용할 프롬프트. 기본적으로 `CORRECT>%R (y|n|e)? ' 로 설정되어있다. 57. promptchars (+) 프롬프트 쉘변수에서 `%#' 일반사용자는 첫 번째 문자(%)로 수퍼유저는 두 번째 문자(#) 로 프롬프트를 출력한다. 58. pushdtohome (+) 인자가 없는 pushd 명령은 `pushd ~' 명령을 실행한다. 59. pushdsilent (+) pushd 와 popd 는 디렉토리 스택에 출력하지 않는다. 60. recexact (+) 단어 완성에서 더 긴 일치가 존재하더라도 완성을 종료한다. 61. recognizeonlyexecutables (+) 실행가능한 파일만을 표시한다. 62. rmstar (+) 사용자가 `rm *' 를 실행하기전에 프롬프트를 출력한다. 63. savedirs (+) 쉘을 종료하기 전에 `dirs -S'을 실행한다. 64. savehist 쉘이 종료하기전에 `history -S' 를 실행한다. 첫 인자로 숫자가 주어지면 많은 라인을 저 장한다. 이때의 수는 history 와 같거나 적어야한다. 두 번째 인자가 `merge'이면 히스토리 파일에 목록을 대치하는 대신 그것에 추가 하고 시간별로 정렬하고 가장 최근의 작업을 보 존한다. 65. sched (+) 스케줄된 일들을 출력하기위한 형식. 주어지지않으면 `%h\t%T\t%R\n' 를 사용한다. 형식열은 프롬프트에 기 술된 것들을 사용 한다. `%R'이 의미하는 것에 주의하라. 66. shell 쉘이 귀속되어있는 파일. 이것은 비트 설정을 실행하는 파일들을 해석하 는 forking 쉘에서 사용된다. 그러나 시스템에서 실행할 수는 없다. 67. shlvl (+) 실행 쉘의 번호. 로그인 쉘은 1이다. 68. status 마지막 명령에서 되돌아온 상태. 비정상적으로 끝났다면 0200을 더한다. 명령들이 실패했을 때는 1이고 다른때는 0이다. 69. symlinks (+) 심볼릭 링크(기호 연결)을 제어하기 위한 여러 가지 다른 값을 설정할 수 있다. `chase' 로 설정한다면, 현재 디렉토리가 심볼릭 링크를 포함하는 디렉토 리로 변경될때에 는 링크가 지정한 디렉토리의 실제 이름으로 확장한다. 이것 은 사용자의 홈디렉토리에서는 작동하지 않는 버그가 있다. `ignore' 로 설정한다면, 쉘은 링크가 연결되기 전에 현재 디렉토리와 관 계된 현재 디렉토 리를 구성한다. 이것은 심볼릭 링크로 디렉토리를 변경하 고 'cd ..' 하는 것은 원래 디렉토 리로 하나를 리턴한다는 것을 의미한다. 이 것은 단지 내부 명령들과 파일이름 완성에 영향 을 준다. `expand' 로 설정한다면, 쉘은 경로 이름들처럼 보이는 실제로 확장한 인 수들로 심볼릭 링 크를 고친다. 이것은 내부 명령이 아닌 명령에 영향을 준 다. 불행하게도 이것은 명령옵션들 을 간직하는 것과 같은 hard-to-recognize 파일이름에서는 작동하지 않는다. 확장은 인용을 금지할지도 모른다. 이 설정 사항은 간단하다. 확장되어야 할 인수 인식을 실 패할때에는 종종 잘못되고 혼란스러울때가 있다. 절충안은 'ignore' 를 사용하고 필요하다면 편집명령 normalize-path(기본 적으로 ^X-n 으로 설정되어 있다.) 를 사용한다. 일부 예제에서는 명령이 존재한다. 첫째로 디렉토리를 설정 한다. > cd /tmp > mkdir from from/src to > ln -s from/src to/dist 여기서는 설정하지 않을때의 symlinks 의 동작이다. > cd /tmp/to/dist; echo $cwd /tmp/to/dist > cd ..; echo $cwd /tmp/from `chase' 로 설정했을때의 symlinks 의 동작, > cd /tmp/to/dst; echo $cwd /tmp/from/src > cd ..; echo $cwd /tmp/from `ignore' 로 설정했을때의 symlinks 의 동작, > cd /tmp/to/dist; echo $cwd /tmp/to/dst > cd ..; echo $cwd /tmp/to `expand' 로 설정했을때의 symlinks 의 동작, > cd /tmp/to/dist; echo $cwd /tmp/to/dst > cd ..; echo $cwd /tmp/to > cd /tmp/to/dist; echo $cwd /tmp/to/dst > cd ".."; echo $cwd /tmp/from > /bin/echo .. /tmp/to > /bin/echo ".." .. `expand' 확장은 단지 cd 에서처럼 `ignore' 처럼 작동하고 인용을 금지 하고 파일이름이 비 내장 명령에서는 지나친다는 것에 주의해라. 70. tcsh (+) `R.VV.PP' 형식의 쉘 버전 번호로서 `R' 은 중요한 배포 번호이고 `VV' 는 현재 버전 그 리고 `PP'는 패치레벨이다. 71. term 터미널 타입. 보통 ~/.login 에서 설정한다. 72. time 시간. 두 번째 인자는 시간을 출력할 형식을 지정한다. ① %U cpu 시간으로 프로세스가 유저모드에서 보낸 시간. ② %S cpu 시간으로 프로세스가 커널모드에서 보낸 시간. ③ %E 경과된 시간. 단위는 초. ④ %P (%U + %S) / %E 로 계산된 CPU 퍼센트. ⑤ %W 프로세스가 스왑된 시간. ⑥ %X 텍스트 공간의 평균량. 단위는 Kbyte 이다. ⑦ %D 데이터 또는 스택의 평균량. 단위는 Kbyte 이다. ⑧ %K (%X + %D) 전체 공간. 단위는 Kbyte 이다. ⑨ %M 프로세스가 한 번에 사용할 수 있는 최대 메모리. 단위는 Kbyte 이다. ⑩ %F 디스크로부터 가지고 오기위해 필요한 메이저 페이지의 수. %R 마이너 페이지의 수. %I 입력 작업의 수. %O 출력 작업의 수. %r 수신된 소켓 메시지의 수. %s 보낸 소켓 메시지의 수. %k 수신된 시그널의 수. %w 자발적인 문맥전환의 수. 대기한다. %c 비자발적인 문맥전환의 수. 단지 첫 번째 4 개의 시퀀스만이 BSD 자원 제한없이 시스템에서 지원한 다. 기본적인 시간 형식은 자원 사용을 지원하는 시스템에서는 `%Uu %Ss %E %P %X+%Dk %I+%Oio %Fpf+%Ww' 이고 지원하지 않는 시스템에서 는 `%Uu %Ss %E %P' 이다. DYNIX/ptx 에서는 %X, %D, %K, %r 와 %s 는 유용할 뿐만아니라 아 래 추가 시퀀스가 있다. ① %Y 수행되는 시스템 호출의 수. ② %Z 0 으로 채워진 페이지의 수. ③ %i 프로세스의 상주하는 설정 크기는 커널에 의해서 증가하는 시간 의 수. ④ %d 프로세스의 상주하는 설정 크기는 커널에 의해서 감소하는 시간 의 수. ⑤ %l 수행된 시스템 호출을 읽은 수. ⑥ %m 수행된 시스템 호출을 기록한 수. ⑦ %p raw 디스크 디바이스로부터 읽은 수. ⑧ %q raw 디스크 디바이스로부터 기록한 수. 그리고 기본적인 시간 형식은 `%Uu %Ss $E %P %I+%Oio %Fpf+%Ww' 이다. CPU 퍼센트는 멀티 프로세서에서는 100%보다 더 높을 수 있다는 것에 주의해라. 73. tperiod (+) periodic 별명의 실행사이의 마침표 또는 분. 74. tty (+) tty 의 이름. 75. uid (+) 사용자의 실제 ID. 76. user 사용자의 로그인 이름. 77. verbose 설정한다면 히스토리 치환후에 출력될 명령의 단어를 발생한다. -v 명령라인 옵션에서 설정한다. 78. version (+) 쉘 버전을 출력한다. shell's version number, origin, 갱신 날짜, 판매자, 운영체제 그리고 시스템 그리고 컴파일시에 설정된 컴마(,)로 분리된 옵션 을 출력한다. 배포판에 기본적으로 설정되어있는 옵션들을 참고해라. ① 8b 8 비트를 사용한다. 기본값이다. ② 7b 7 비트를 사용한다. ③ nls 시스템의 NLS 를 사용한다. 기본값이다. ④ lf 로그인 쉘은 /etc/csh.cshrc 를 읽기전에 /etc/csh.login 을 실행하고 ~/.tcshrc 와 ~/.tcshrc 를 읽기전에 읽는다. ⑤ dl `.' 를 마지막에 놓는다. 기본값이다. ⑥ nd `.' 를 경로에서 제거한다. ⑦ vi 편집 스타일을 vi 스타일로 설정한다. ⑧ dtr 종료할 때 로그인쉘은 DTR 을 나타낸다. ⑨ bye bye 는 로그아웃과 동일하고 log 는 watchlog 의 또 다른 이름이다. ⑩ al autologout 을 사용한다. 기본적으로 설정된다. kan Kanji 를 사용하고 nokanji 쉘변수를 설정하지 않았다면 ISO 문자셋을 무시한다. sm 시스템의 malloc 를 사용한다. hb `#! ' 규정은 쉘 스크립트를 실행할 때 에뮬레이트 한다. ng newgrp 로 사용가능하다. rh 쉘이 REMOTEHOST 환경변수를 설정하도록 시도한다. afs 증명이 실패한다면 당신의 패스워드를 확인한다. afsuser 쉘 변수 또는 AFSUSER 환경변수는 로컬 사용자이름을 무시 한다. 관리자는 로 컬버전에서 차이점을 가리키기위해서 추가 문자열을 입력할 수 있다. 79. visiblebell (+) 설정한다면 소리보다는 화면 깜빡임을 사용된다. nobeep 를 참고해라. 80. watch (+) 로그인, 로그아웃을 감시하기위한 사용자와 터미널 쌍의 목록을 설정한다. 사용자와 터미널이 'any' 로 설정한다면 들어오는 모든 사용자와 모든 터 미널을 감시한다. '(any any)' 로 watch 를 설정한다면 모든 사용자와 터미널을 감시한다. 예를들어 set watch = (george ttyd1 any console $user any) 로 설정한 다면 ttyd1 으로 들어오는 george 와 콘솔로 들어오는 어떤 사용자 그리 고 어느 터미널로 들어오는 자신의 활동을 보고한다. 로그인과 로그아웃은 기본값으로 매 10분마다 점검하지만 몇 분마다 점검 할 것인가를 watch 에 첫 번째 단어에 주어서 설정할 수 있다. 예를들어 set watch = (1 any any) 와 같이 설정되어있다면 매 분마다 로그인, 로그 아옷을 보고한다. 로그 빌트인 명령은 어느때나 watch 보고를 발생한다. 모든 현재 로그인 들은 watch 가 설 정되어 있을때만 감시한다. who 쉘 변수는 경계 보고서 의 형식을 제어한다. 81. who (+) 경계 메시지를 형식 문자열을 지정한다. 아래 문자열은 주어진 정보로 대 치된다. ① %n : 로그인, 로그아웃하는 사람의 이름. ② %a : 로그온, 로그아웃 또는 사용자대치등과 같은 주목되는 실행. ③ %l : 사용자가 로그인, 로그아웃하는 터미널. ④ %M : 지역 호스트로부터 로그인, 로그아웃한다면 원격 또는 지역 호 스트의 전체 호스 트 이름. ⑤ %m : 첫 번째 '.' 까지의 원격 호스트 이름. IP 주소이거나 X 윈도우시스템이다면 전체 호스트이름을 출력한 다. %M 과 %m 는 단지 /etc/utmp 에 원격 호스트 이름이 저장되어 있는 시스템에서 만 사용가능하다. 설정되지 않으면 `%n has %a %l from %m.' 이 사용되거나 원격 호스트 이름이 저장되어 있지 않는 시스템에서는 `%n has %a %l.' 을 사용한다. 82. wordchars (+) forward-word, back-ward-word 와 같은 편집명령들로 단어의 부분으로 간주하는 알파벳 이 아닌 문자들의 목록을 설정한다. 설정하지 않으면 `*?-.[]~=' 이 사용된다. XX II. 환경 변수(ENVIRONMENT) 1. AFSUSER (+) afsuser 쉘 변수와 유사하다. 2. COLUMNS 터미널에서 사용하는 칼럼수를 정의한다. 터미널 운영을 참고해라. 3. DISPLAY X 윈도우에서 사용한다. 이것을 설정하면 쉘은 autologout이 설정되지 않 는다. 4. EDITOR 기본 편집기의 완전경로를 입력한다. 환경변수와 run-fg-editor 편집 명령 을 참고해라. 5. GROUP (+) group 쉘 변수와 비슷하다. 6. HOME home 쉘 변수와 비슷하다. 7. HOST (+) 쉘이 실행중일 때 gethostname 시스템 호출로 정의된 컴퓨터 이름을 초 기화한다. 8. HOSTTYPE (+) 쉘이 실행중일 때 compile time 으로 정의된 컴퓨터 타입을 초기화한다. 이 변수는 다음 버전에서는 사용되지 않을 것이다. 9. HPATH (+) run-help 편집 명령이 도움말 문서를 찾는데 사용하고 디렉토리는 콜론(:) 으로 분리한다. 10. LANG 우선권을 가진 문자 환경을 정의한다. 국제 언어 시스템 지원부를 참고해 라. 11. LCCTYPE 이 변수가 설정된다면 ctype 문자 처리가 변경된다. 국제 언어 시스템 지 원부를 참고해라. 12. LINES 터미널에서 사용하는 라인수를 정의한다. 터미널 운영을 참고해라. 13. MACHTYPE (+) compile time 에서 정의한 컴퓨터 타입을 정의한다. 컴퓨터 타입은 마이 크로 프로세서 종 류와 컴퓨터 모델이다. 14. NOREBIND (+) 설정한다면 출력할 수 있는 문자들은 self-insert-command 로 재(再) 연 결되지 않는다. 국제 언어 시스템 지원부를 참고해라. 15. OSTYPE (+) compile time 으로 정의한 운영체제를 정의한다. 16. PATH 실행 파일을 찾기위한 디렉토리를 콜론(:)으로 분리해서 정의한다. path 쉘 변수와 비슷하 나 다른 형식이다. 17. PWD (+) cwd 쉘 변수와 비슷하나 그것과 같지는 않다. 단지 실제 디렉토리를 변 경한 후에만 갱신 한다. 18. REMOTEHOST (+) 사용자가 원격지로부터 로그인한 호스트이다. 이런 경우에는 쉘이 그것을 정의할 수 있다. 쉘이 그러하도록 컴파일되어 있을 경우에만 설정한다. version 쉘 변수를 참고해라. 19. SHLVL (+) shlvl 쉘 변수와 비슷하다. 20. SYSTYPE (+) 현재 시스템 타입을 설정하고 단지 Domain/OS 일때만 가능하다. 21. TERM term 쉘 변수와 비슷하다. 22. TERMCAP 터미널이 출력가능한 문자열을 정의한다. 터미널 운영을 참고해라. 23. USER user 쉘 변수와 비슷하다. 24. VENDOR (+) compile time 에서 정의한 vendor 를 정의한다. 25. VISUAL 기본 전화면 편집기의 완전경로를 정의한다. EDITOR 환경변수와 run-fg-editor 편집 명령 을 참고해라. XX III. 설정파일(FILES) 1. /etc/csh.cshrc 모든 쉘이 실행될 때 첫 번째로 읽는다. ConvexOS, Stellix 그리고 Intel 은 /etc/cshrc 를 사용하고 NeXTs 는 /etc/cshrc.std 를 사 용한다. A/UX, AMIX, Cray 그리고 IRIX 는 csh 과 동 일하지 않고, 이 파일은 어떻든 tcsh 에서 읽는다. Solaris 2.x 은 그것 을 가지고 있지 않지만 tcsh 은 /etc/.cshrc 을 읽는 다. 2. /etc/csh.login /etc/csh.cshrc 를 읽은 후에 로그인 쉘에서 읽는다. ConvexOS, Stellix 그 리고 Intel 는 /etc/login 을 사용하고, NeXTs 는 /etc/login.std 를 사 용한다. Solaris 2.x 는 /etc/.login 를 사용하고 A/UX, AMIX, Cray 그리 고 IRIX 는 /etc/cshrc 를 읽는다. 3. ~/.tcshrc (+) /etc/csh.cshrc 를 읽은 후에 모든 쉘에서 읽는다. 또는 그것과 비슷한 것 을 읽는다. 4. ~/.cshrc 모든 쉘에서 읽는다. /etc/csh.cshrc 를 읽은 후에 ~/.tcshrc 이 존재하지 않는다면 그와 비 슷한 것을 읽는다. 여기서는 ~/.tcshrc 는 ~/.tcshrc 를 의 미하고 ~/.tcshrc 없다면 ~/.cshrc 이다. 5. ~/.history ~/.tcshrc를 읽은 후에 savehist가 설정되어 있다면 로그인쉘이 읽는다. histfile을 참고해라. 6. ~/.login ~/.tcshrc 이나 ~/.history 를 읽은 후에 로그인 쉘에서 읽는다. 쉘이 ~/.tcshrc 그리고 ~/.history 를 읽은 후에 ~/.login 을 읽도록 컴파일되 었다면 읽는다. version 쉘 변수를 참 고해라. 7. ~/.cshdirs (+) savedirs 이 설정되어 있다면 ~/.login 을 읽은 후에 로그인 쉘에서 읽는 다. dirsfile 을 참고 해라. 8. /etc/csh.logout 로그아웃시에 로그인 쉘에서 읽는다. ConvexOS, Stellix 그리고 Intel 는 /etc/logout 를 사용하고 NeXTs 는 /etc/logout.std 를 사용한다. A/UX, AMIX, Cray 그리고 IRIX 는 csh 일때 는 없지만 tcsh 은 읽는다. Solaris 2.x 은 존재하지 않지만 tcsh 은 /etc/.cshrc 을 읽는다. 9. ~/.logout 로그아웃시 /etc/csh.logout 을 읽은 후에 읽는다. 10. /bin/sh Used to interpret shell scripts not starting with a `#'. '#' 문자로 시작되지 않는 쉘 스크립트를 해석한다. 11. /tmp/sh* `<<' 파이프라인을 위한 임시 파일이다. 12. /etc/passwd ~name 치환을 위한 사용자 디렉토리와 쉘 그리고 암호를 정의한다. 쉘이 다르게 컴파일되어 있다면 스타트업 파일들을 읽는 순서가 다를 수도 있다. Startup 과 shutdown 그리고 version 쉘 변수를 참고해라. XX IV. 새로운 기능(New Features) (+) 이 문서는 tcsh 의 단순한 모습에 대해 설명한다. 그러나 경험이 많은 csh 사용자들은 tcsh 의 특별한 기능에 주의하기 바란다. GNU emacs 와 vi 형태의 키 바인딩을 지원하는 명령라인 편집기 (command-line editor 참 고). 프로그램이 가능하고 상호작용하는 단어 완성 과 목록화(Completion 과 Listing 그리고 complet 와 uncomplete 내부명령 참 고). 파일이름, 명령어와 변수들의 철자 수정. 명령을 타이프한 중간에 다른 유용한 기능을 수행하고 도움말 문서 포함 (run-help), 그리고 빠르게 편집기를 재시작(run-fg-editor)와 명령 분해력(which-command)와 같은 편집기 명령 들. 히스토리 목록을 시간으로 분류하고 이전에 문서화되지 않은 '#' 지정자, 히스토리 치환에 서 사용하는 새로운 수정자 그리고 *-history, history-search-*, i-search-*, vi-search-*, toggle-literal-history 편집기 명령들과 histlit 쉘변수와 같은 히스토리 처리 강화 명령들 (history 명령과 이와 관련된 쉘변수를 참고). cd, pushd, popd, dirs 명령들과 그것과 연관된 쉘변수들, 디렉토리 스택 치환 그리고 dirstack, owd, symlinks 쉘변수들, normalize-command 와 normalize-path 편집기 명령들과 같이 강화 된 디렉토리 처리와 디렉토리 스택 처리. glob-patterns 의 취소(파일이름 치환 참조). 새로운 파일 검사 연산자와 이것을 사용하는 파일 검사 내부 명령. 자동, 기간, 지정 시간등을 이용한 작업 예약 실행. 특수한 별명들, 자동 로그 아웃과 터미널 잠 금, 로그인과 로그아웃 감시기능. 국제 언어 시스템 지원과 다양한 운영체제 지원과 시스템 의 존 파일 지정. 확장된 터미널 운영 특성(터 미널 운영 참고). builtins, hup, ls -F, new-grp, printenv, which, where 와 같은 새로운 내부 명령. gid, loginsh, oid, shlvl, tcsh, tty, uid, version 쉘변수들과 HOST, REMOTEHOST, VENDOR, OSTYPE, MACHTYPE 환경변수들과 같 이 쉘을 쉽게 사용할 수 있도록 하는 새 로운 변수들. 프롬프트 문자열에 유용한 정보를 제공하는 새로운 구문과 루프나 스펠링 정 정을 확인하기 위 한 특수한 프롬프트(prompt, prompt2, prompt3 참고). 읽기 전용 변수들(변수 치환 참고). XX V. 버그(BUGS) 지연된 명령을 재시작할 때 현재 디렉토리와 다를 경우 그것이 시작한 디렉 토리를 출력한다. 이것은 작업이 내부적으로 디렉토리를 변경할 경우에는 잘못된다. 쉘 내부 기능들은 멈추거나 재시작할 수 없다. 'a;b;c' 와 같은 형식의 명령줄을 멈추고자 할 때 자연스럽게 처리되지 않는 다. 'b' 를 지연시키 고자 한다면 즉시 'c' 가 실행된다. 별명으로 부터 이런 확장 을 실행한다면 특히 주의해야한다. 그것을 강제로 자식 쉘에서 강제로 실행하 고자 한다면 '(a;b;c)' 와 같이 괄호로 둘러싸야 한 다. 프로세스들이 시작된 후에 tty 출력 제어는 처음에 해야 한다. 그렇지 않으면 이것은 누군 가가 좋은 가상 터미널 인터페이스에서 동작하도록 할 것이다. 가상 터미널 인터페이스에서 훨 씬 더 이로운 일들과 출력 제어와 함께 동작하게 된다. 별명 치환은 종종 쉘 수행을 다루기 힘들게 시뮬레이트할 수 있다. 쉘 수행 은 차라리 별명들 을 제공한다. 루프가 있는 명령들은 히스토리 목록에 포함되 지 않는다. 제어 구조는 내부 명령 으로 인식되어 해석될 수 있다. 이것은 제 어명령들이 어디에 위치할 수 있고 '|' 와 조합될 수 있고 '&', ';' 메타구문과 함께 사용될 수 있다. foreach 문은 끝을 찾을 때 문서를 무시하지 않는다. 명령 치환의 출력에 ':' 수정자를 사용해 서 가능하게 해야 한다. 화면 폭보다 더 크게 화면을 갱신하는 것은 터미널이 커서를 위로 할 수 없다면 매우 나쁘게 된다(터미널 종류는 'dumb' 를 참고). HPATH 와 NOREBIND 는 환경변수로 필요하지 않다. '?', '*', '[]' 를 사용하지 않거나 '{}', '~' 를 사용하는 glob-patterns 은 정확하 게 취소할 수 없 다. 출력 리다이렉션의 한 명령형식에서 식이 거짓일 지라도 명 령이 실행되지 않는다. ls -F 는 파일이름으로 정렬할 경우에 파일 증명 문자를 포함한다. 버그는 tcsh-bugs@mx.gw.com 로 보고해라. 그러나 고치는 것이 낫다. tcsh 유지와 점검을 돕고 싶다면 본문에 'subscribe tcsh ' 라는 한 줄 을 적어서 listserv@mx.gw.com 로 메일을 보내라. 또한 모든 버그 보고서를 얻고 싶다면 'subscribe tcsh-bugs ' 라 는 한 줄을 적어 보내고, 각 패치레벨을 위한 개발 목록을 얻고 싶다면 'subscribe tcsh-diffs ' 라고 한 줄을 적어서 메일을 보내라. XX VI. Tcsh 에서 T(THE T IN TCSH) 1964, 12 월 PDP-6 에서 개발했다. 후에 PDP-10 에서 재실행되었다. 1970 년에 DECsystem 에서 재사용되었으며 DEC 는 후에 KI10 이라는 모델을 만 들었다. TENEX 는 1972 년에 Bolt, Beranek & Newman (메사추세츠 캠 브리지 대학)이 요구하고 기록하는 가상메모리 운영 체제에서 실험용으로 만들 었다. 그들은 DEC PDP-10 를 위해 새롭게 만들었고 그것을 작동하 기 위한 운영체제를 만들었다. 학문적으로는 성공적이었다. 1975 에 DEC 는 PDP-10의 새 모 델인 KL10 을 만들었다. 그들은 단지 TENEX 버전만 만들 작정이었다. 그리고 BNN 에서 새 로운 것에 대해 특허를 받았다. 그들은 그것을 TOPS-20 라고 불렀다. 많은 TOPS-10(The OPerating System for PDP-10) 사용자들을 대상으로 했다. DEC 는 같 은 하드웨어에서 두 시스템이 호환되도록 지원하는 PDP-11 버전 6 을 자체적으로 개발했다. TENEX, TOPS-20 버전 3 은 ULTCMD 로 불리는 사용자 코드 레벨 서브루틴을 통해 명령 완성을 가지고 있었다. 버전 3 에서 DEC 는 그런 특성과 COMND% JSYS(Jump to SYStem) 에 접근하는 Unix 를 사용하는 제안자에게서 더 많은 모든 것을 옮겼다. tcsh 를 만든 사람은 이 기능과 TENEX 의 여러 다른 버전과 TOPS-20에서 감명을 받았다. 그리고 그것을 흉내낸 csh 버전을 만들었다. XX VII. 제한(LIMITATIONS) 단어는 1024 문자보다 크지 않아야한다. 시스템은 인자 목록을 10240 문자로 제한한다. 파일이름확장을 포함하는 명령에서 인자들의 수는 인자 목록에서 허락한 문 자들의 1/6 로 제 한된다. 명령 치환은 인자 목록에서 인정하는 것보다 작게 문자를 치환한다. 순환을 검출하기 위해 쉘은 한 라인에 별명 치환의 수를 20 으로 제한한다. XX VIII. 참고기능 csh(1), emacs(1), ls(1), newgrp(1), sh(1), setpath(1), stty(1), su(1), tset(1), vi(1), x(1), access(2), execve(2), fork(2), killpg(2), pipe(2), setrlimit(2), sigvec(2), stat(2), umask(2), vfork(2), wait(2), malloc(3), setlocale(3), tty(4), a.out(5), termcap(5), environ(7), termio(7), Introduction to the C Shell XX IX. 버전 이것은 tcsh 6.06.00 (Cornell) 1995-04-29 을 위한 문서이다. XXX. 만든이(프로그래머) William Joy : Original author of csh(1) J.E. Kulp, IIASA, Laxenburg, Austria : Job control and directory stack features Ken Greer, HP Labs, 1981 : File name completion Mike Ellis, Fairchild, 1983 : Command name recognition/completion Paul Placeway, Ohio State CIS Dept., 1983-1993 : Command line editor, prompt routines, new glob syntax and numerous fixes and speedups Karl Kleinpaste, CCI 1983-4 : Special aliases, directory stack extraction stuff, login/logout watch, scheduled events, and the idea of the new prompt format Rayan Zachariassen, University of Toronto, 1984 : ls -F and which builtins and numerous bug fixes, modifications and speedups Chris Kingsley, Caltech : Fast storage allocator routines Chris Grevstad, TRW, 1987 : Incorporated 4.3BSD csh into tcsh Christos S. Zoulas, Cornell U. EE Dept., 1987-94 : Ports to HPUX, SVR2 and SVR3, a SysV version of getwd.c, SHORTSTRINGS support and a new version of sh.glob.c James J Dempsey, BBN, and Paul Placeway, OSU, 1988 : A/UX port Daniel Long, NNSC, 1988 : wordchars Patrick Wolfe, Kuck and Associates, Inc., 1988 : vi mode cleanup David C Lawrence, Rensselaer Polytechnic Institute, 1989 : autolist and ambiguous completion listing Alec Wolman, DEC, 1989 : Newlines in the prompt Matt Landau, BBN, 1989 : ~/.tcshrc Ray Moody, Purdue Physics, 1989 : Magic spacebar history expansion Mordechai ????, Intel, 1989 : printprompt() fixes and additions Kazuhiro Honda, Dept. of Computer Science, Keio University, 1989 : Automatic spelling correction and prompt3 Per Hedeland, Ellemtel, Sweden, 1990- : Various bugfixes, improvements and manual updates Hans J. Albertsson (Sun Sweden) : ampm, settc and telltc Michael Bloom : Interrupt handling fixes Michael Fine, Digital Equipment Corp : Extended key support Eric Schnoebelen, Convex, 1990 : Convex support, lots of csh bug fixes, save and restore of directory stack Ron Flax, Apple, 1990 : A/UX 2.0 (re)port Dan Oscarsson, LTH Sweden, 1990 : NLS support and simulated NLS support for non NLS sites, fixes Johan Widen, SICS Sweden, 1990 : shlvl, Mach support, correct-line, 8-bit printing Matt Day, Sanyo Icon, 1990 : POSIX termio support, SysV limit fixes Jaap Vermeulen, Sequent, 1990-91 : Vi mode fixes, expand-line, window change fixes, Symmetry port Martin Boyer, Institut de recherche d'Hydro-Quebec, 1991 : autolist beeping options, modified the history search to search for the whole string from the beginning of the line to the cursor. Scott Krotz, Motorola, 1991 : Minix port David Dawes, Sydney U. Australia, Physics Dept., 1991 : SVR4 job control fixes Jose Sousa, Interactive Systems Corp., 1991 : Extended vi fixes and vi delete command Marc Horowitz, MIT, 1991 : ANSIfication fixes, new exec hashing code, imake fixes, where Bruce Sterling Woodcock, sterling@netcom.com, 1991-1995 : ETA and Pyramid port, Makefile and lint fixes, ignoreeof=n addition, and various other portability changes and bug fixes Jeff Fink, 1992 : complete-word-fwd and complete-word-back Harry C. Pulley, 1992 : Coherent port Andy Phillips, Mullard Space Science Lab U.K., 1992 : VMS-POSIX port Beto Appleton, IBM Corp., 1992 : Walking process group fixes, csh bug fixes, POSIX file tests, POSIX SIGHUP Scott Bolte, Cray Computer Corp., 1992 : CSOS port Kaveh R. Ghazi, Rutgers University, 1992 : Tek, m88k, Titan and Masscomp ports and fixes Mark Linderman, Cornell University, 1992 : OS/2 port Mika Liljeberg, liljeber@kruuna.Helsinki.FI, 1992 : Linux port Tim P. Starrin, NASA Langley Research Center Operations, 1993 : Read-only variables Dave Schweisguth, Yale University, 1993-4 : New manpage and tcsh.man2html Larry Schwimmer, Stanford University, 1993 : AFS and HESIOD patches Luke Mewburn, RMIT University, 1994 : Enhanced directory printing in prompt XXX I. 고마운 사람 Bryan Dunlap, Clayton Elwell, Karl Kleinpaste, Bob Manson, Steve Romig, Diana Smetters, Bob Sutterfield, Mark Verber, Elizabeth Zwicky and all the other people at Ohio State for suggestions and encouragement All the people on the net, for putting up with, reporting bugs in, and suggesting new additions to each and every version Richard M. Alderson III, for writing the `T in tcsh' section