C 쉘

C shell
C 쉘
Tcsh ejecutándose en escritorio Mac OSX.png
Mac OS X 데스크톱에서 tcsh와 sh를 나란히 사용
원저작자빌 조이
초기 릴리즈1978년, 44년(연장)
안정된 릴리스
6.20.00 / 2016년 11월 24일, 5년 전(2016-11-24)[1]
저장소
기입처C
운영 체제BSD, UNIX, Linux, macOS
유형Unix 쉘
면허증.BSD 라이선스
Windows Services for UNIX에서 실행되는 C 쉘

C 쉘(csh 또는 개량판, tcsh)은 1970년대 후반 Bill Joy가 캘리포니아 대학교 버클리 대학원생일 때 만든 Unix 쉘입니다.1978년 [2][3]Joy가 처음 배포한 버클리 소프트웨어 배포(BSD)의 2BSD 릴리즈를 시작으로 널리 배포되었습니다.아이디어 또는 코드에 대한 다른 초기 기여자들은 Michael Ubell, Eric Allman, Mike O'Brien 및 Jim [4]Kulp이었다.

C 쉘은 일반적으로 텍스트창에서 실행되는 명령어프로세서입니다.이것에 의해, 유저는 커맨드를 입력해 실행할 수 있습니다.C 쉘은 스크립트라고 불리는 파일에서 명령을 읽을 수도 있습니다.모든 Unix 쉘과 마찬가지로 조건 테스트 및 반복을 위한 파일 이름 와일드카드, 파이프, 문서, 명령어 대체, 변수제어 구조를 지원합니다.특히 1980년대에 C 쉘을 다른 셸과 차별화한 것은 인터랙티브 기능과 전체적인 스타일이었다.새로운 기능으로 인해 사용이 더 쉽고 더 빨라졌습니다.그 언어의 전체적인 스타일은 C와 더 닮았고 더 읽기 쉽다고 여겨졌다.

macOS나 Red Hat Linux 등 많은 시스템에서 csh는 실제로는 csh의 개량형인 tcsh입니다.대부분의 경우 두 파일 중 하나는 하드링크 또는 다른 파일로의 심볼릭링크입니다.따라서 어느 하나의 이름이 C 쉘의 개량된 버전을 나타냅니다.원래의 csh 소스 코드와 바이너리는 NetBSD의 일부입니다.

Debian 및 일부 파생상품(Ubuntu 포함)에서는 csh와 tcsh의 두 가지 패키지가 있습니다.전자는 csh의 원래 BSD[5][6] 버전을 기반으로 하고 후자는 개선된 [7][8]tcsh를 기반으로 합니다.

tcsh는 [9]t의 소스인 Tenex 시스템에서 차용한 파일 이름, 명령어 완료 및 명령줄 편집 개념을 추가했습니다.tcsh는 기능만 추가하고 기존 기능을 변경하지 않았기 때문에 원래 C 쉘과의 하위[10] 호환성을 유지했습니다.원래 Joy가 만든 소스 트리에서 사이드 브랜치로 시작되었지만, 현재는 tcsh가 개발의 주 브런치입니다.tcsh는 매우 안정적이지만 새로운 릴리스는 1년에 한 번 정도 계속 등장하며, 대부분 사소한 버그 [11]수정으로 구성되어 있습니다.

설계 목적 및 기능

C 쉘의 주요 설계 목표는 C 프로그래밍 언어와 더 비슷해야 하며 대화형 사용에 더 적합해야 한다는 것이었다.

C에 가깝다

Unix 시스템은 거의 C로만 작성되었기 때문에 C 쉘의 첫 번째 목표는 시스템의 나머지 부분과 보다 스타일적으로 일치하는 명령어였습니다.키워드, 괄호 사용, C 쉘의 삽입 표현 문법과 배열 지원은 모두 C의 영향을 많이 받았습니다.

오늘날 기준으로 볼 때 C 셸은 다른 많은 일반적인 스크립트 언어보다 특별히 C 셸처럼 보이지 않을 수 있습니다.그러나 80년대와 90년대에 걸쳐, 그 차이는 특히 벨 연구소의 스티븐 본이 쓴 당시 지배적인 껍질인 본 껍질비교했을 때 두드러졌다.이 예에서는 C 쉘의 보다 일반적인 표현 연산자와 구문을 보여 줍니다.

본 셸

#!/bin/sh [$days -gt 365]인 경우 에코 1년이 넘었습니다.fi

C 쉘

#!/bin/csh if ($days > 365 )그럼 에코 이것은 1년이 넘었습니다.엔디프

Bourne sh는 표현 문법이 부족했다.각 괄호로 묶인 조건은 외부 테스트 프로그램을 실행하는 느린 방법으로 평가해야 했습니다.sh의if명령어는 인수 단어를 하위 프로세스로 실행할 새로운 명령어로 받아들였습니다.자녀가 제로 리턴 코드를 사용하여 종료한 경우 sh는 then 구(다른 문이지만 세미콜론으로 같은 줄에 결합되어 있는 경우가 많다)를 검색하여 해당 중첩된 블록을 실행합니다.그렇지 않으면 다른 것이 실행됩니다.테스트 프로그램을 양쪽으로 하드 링크하다test" 및 "["는 대괄호의 특징적인 이점 및 테스트 기능이 sh 언어의 일부라는 외관을 제공했습니다.sh가 컨트롤 블록의 끝을 표시하기 위해 역키워드를 사용한 것은 ALGOL [12]68에서 차용한 스타일입니다.

이에 비해 csh는 식을 직접 평가할 수 있으므로 더 빨리 계산할 수 있습니다.또한 가독성도 향상되었습니다.표현식에서는 문법과 연산자 세트를 주로 C에서 복사하여 키워드를 변경하지 않고 전체적인 스타일도 C에 가깝습니다.

다음으로 2의 첫 번째 10제곱을 계산하는 스크립트를 비교하는 예를 나타냅니다.

본 셸

#!/bin/sh i=2 j=1인 동안 [$j -le 10]는 '2 **' 에코합니다.$j = $i ='expr $i '*' 2' j ='expr $j + 1' 완료

C 쉘

#!/bin/csh set i = 2 set j = 1인 반면 ($j <= 10 ) echo '2 **' $j = $i @i *= 2 @j++ end

표현식 문법이 없기 때문에 sh 스크립트는 명령어 치환과 expr 명령을 사용합니다.(현대 POSIX 은 이러한 문법을 가지고 있습니다: 문이 쓰여질 수 있습니다.i=$((i * 2))또는: "$((i *= 2))".)

마지막으로 스위치 문의 다른 스타일을 나타내는 세 번째 예를 나타냅니다.

본 셸

#!/bin/sh for i in d* do case $i in d?) echo $i는 짧다;*) echo $i는 길다; esac done

C 쉘

#!/bin/csh foreachi(d*) 스위치($i ) 케이스 d?: echo $i는 숏 브레이크스 디폴트: echo $i는 long endsw ends

sh 스크립트에서는,;;sh는 늘스테이트먼트를 허용하지 않기 때문에 각 케이스의 끝을 나타냅니다.

인터랙티브한 점

두 번째 목표는 C 쉘이 대화형 사용에 더 적합해야 한다는 것이었다.단말기에서 명령어를 입력함으로써 보다 쉽고 빠르고 사용하기 쉽게 하는 수많은 신기능을 도입했습니다.사용자는 훨씬 적은 키 입력으로 작업을 수행할 수 있었고 실행 속도가 빨라졌습니다.이러한 새로운 기능 중 가장 중요한 것은 이력 및 편집 메커니즘, 에일리어스, 디렉토리 스택, 칠드 표기법, cdpath, 작업 제어 및 경로 해시입니다.이러한 새로운 기능들은 매우 인기가 있었으며, 그 후 많은 기능들이 다른 유닉스 쉘에 의해 복사되었다.

역사

History를 사용하면 이전 명령을 불러오고 몇 번의 빠른 키 입력만 입력하여 다시 실행할 수 있습니다.예를 들어 느낌표 두 개를 입력합니다(').!!명령어로 인해 직전 명령어가 실행됩니다.[13]기타 짧은 키 입력 조합(예: ")!$('이전 명령어의 최종 인수'를 의미)를 사용하면 이전 명령어의 비트와 조각을 붙여넣고 편집하여 새 명령을 구성할 수 있습니다.

편집 연산자

이전 명령어의 텍스트뿐만 아니라 변수 치환에 대해서도 편집할 수 있습니다.연산자는 단순한 문자열 검색/바꾸기에서 경로 이름을 구문 분석하여 특정 세그먼트를 추출할 수 있습니다.

에일리어스

에일리어스를 사용하면 에일리어스의 이름을 입력하고 사용자가 정의한 단어 세트로 C 쉘이 내부적으로 에일리어스를 확장할 수 있습니다.많은 간단한 상황에서 에일리어스는 스크립트보다 실행 속도가 빠르고 편리합니다.

디렉토리 스택

디렉토리 스택을 사용하면, 현재의 작업 디렉토리를 푸시 또는 팝 할 수 있기 때문에, 파일 시스템내의 다른 장소를 간단하게 왔다 갔다 할 수 있습니다.

칠데 표기법

Tilde 표기법은 홈디렉토리에 상대적인 패스명을 지정하는 간단한 방법을 제공합니다.~" 문자.

파일 이름 완료

이스케이프 키는 대화형으로 사용하여 현재 명령줄 끝에 파일 이름의 완료 가능성을 표시할 수 있습니다.

Cdpath

Cdpath는 검색 경로 개념을cd(디렉토리 변경) 명령어:지정된 디렉토리가 현재 디렉토리에 없는 경우 cdpath 디렉토리에서 검색을 시도합니다.

작업 제어

1980년대까지만 해도 대부분의 사용자는 여러 개의 창을 차단하는 단순한 문자 모드 단말기만 가지고 있었기 때문에 한 번에 하나의 작업만 수행할 수 있었습니다.C 셸의 작업 제어를 통해 사용자는 현재 액티비티를 일시 정지하고 작업이라고 불리는 C 셸의 새 인스턴스를 생성할 수 있습니다.^Z그 후 사용자는 명령어를 사용하여 여러 작업을 전환할 수 있습니다.현재 활동 중인 일은 전면에 있다고 한다.다른 작업은 중단(중지)되었거나 백그라운드에서 실행 중인 것으로 알려졌습니다.

패스 해시

경로 해시를 사용하면 C 쉘의 실행 파일 검색 속도가 빨라집니다.파일이 검출되거나 가능성이 없어질 때까지 각 경로디렉토리에서 파일시스템콜을 한 번에 하나씩 실행하는 것이 아니라 C 쉘은 경로디렉토리를 스캔하여 작성된 내부 해시 테이블을 참조합니다.이 테이블은 보통 검색 없이 C 쉘에 파일(존재하는 경우)을 찾을 수 있으며 를 사용하여 새로고침할 수 있습니다.rehash명령어를 입력합니다.

언어의 개요

C 쉘은 한 번에 1줄씩 동작합니다.각 행은 괄호, 파이프 및 입출력 리다이렉션 연산자, 세미콜론, 앰퍼샌드 등 공백으로 구분된 단어 세트 또는 특별한 의미를 가진 다른 문자로 토큰화됩니다.

기본문

기본문은 단순히 명령어를 실행하는 명령어입니다.첫 번째 단어는 실행할 명령어의 이름으로 간주되며, 예를 들어 다음과 같은 내부 명령어일 수 있습니다.echo또는 외부 명령어.나머지 단어는 명령어에 인수로 전달됩니다.

기본문 수준에서 문법의 몇 가지 특징은 다음과 같습니다.

와일드카드 처리

C 쉘은 모든 Unix 쉘과 마찬가지로 와일드카드 문자를 포함하는 명령줄 인수를 패턴으로 취급하고 일치하는 모든 파일 이름 목록으로 대체합니다(글로빙 참조).

  • *는 임의의 수의 문자와 일치합니다.
  • ?는 임의의 단일 문자와 일치합니다.
  • [...]는 각 괄호 안의 임의의 문자와 일치합니다.하이픈을 사용하여 범위를 지정할 수 있습니다.
  • [^...]는 세트에 없는 임의의 문자와 일치합니다.

C 쉘은 또한 다른 Unix 쉘에 의해 복사되었기 때문에 몇 가지 알림 편의(확장 글로벌이라고도 함)를 도입했습니다.

  • abc{def,ghi} abcdefabcghi확장됩니다.
  • ~는 현재 사용자의 홈디렉토리를 의미합니다.
  • ~user는 사용자의 홈디렉토리를 의미합니다.

복수의 디렉토리 레벨의 와일드 카드(예: 「」)*/*.c" 가 지원되고 있습니다.

버전 6.17.01 이후로는 재귀적인 와일드카드화 (예: "**/*.c" 또는***/*.html")는 또한globstar선택.

Unix 에서는, 셸에 와일드 카드의 해석의 책임을 부여하는 것이 중요한 결정이었습니다.즉, 와일드카드는 모든 명령에서 항상 같은 방식으로 작동한다는 것을 의미합니다.단, 이 결정은 명령어를 실행하기 위해 csh가 사용하는 exec 시스템 호출을 통해 긴 인수 목록을 효율적으로 전달하는 Unix의 능력에 의존했습니다.반면, Windows 에서는, 통상은 각 애플리케이션에 의해서 와일드 카드 해석이 실행됩니다.이는 응용 프로그램에 128바이트 명령줄만 전달할 수 있도록 한 MS-DOS의 유산이며, DOS 명령 프롬프트에 의한 와일드카드 사용은 실용적이지 않습니다.최신 Windows에서는 최대 32,000자의 Unicode 문자를 사용할 수 있지만, 와일드카드 해석에 대한 부담은 어플리케이션에 남아 있습니다.

I/O 리다이렉션

기본적으로는 csh가 명령을 실행하면 명령어는 stdin, stdoutstderr대한 csh의 stdio 파일핸들을 상속합니다.이러한 핸들들은 보통 C 셸이 실행되고 있는 콘솔창을 가리키고 있습니다.I/O 리다이렉션 연산자는 명령어가 입출력 대신 파일을 사용할 수 있도록 합니다.

  • > file은 stdout이 파일에 기록되고, 있는 경우는 덮어쓰며, 없는 경우는 작성하는 것을 의미합니다.셸 창에 아직 오류가 나타난다.
  • >& file은 stdout과 stderr이 모두 파일에 기록되고 있는 경우 덮어쓰고 없는 경우 작성하는 것을 의미합니다.
  • >> file은 stdout이 파일 끝에 추가됨을 의미합니다.
  • >>& file은 stdout과 stderr이 모두 파일 끝에 추가됨을 의미합니다.
  • < file은 stdin이 파일에서 읽히는 것을 의미합니다.
  • << string여기 문서입니다.Stdin은 문자열과 일치하는 행까지 다음 행을 읽습니다.

참가

명령어는 같은 행으로 결합할 수 있습니다.

  • ;첫 번째 명령어를 실행하고 다음 명령을 실행하는 것을 의미합니다.
  • &&첫 번째 명령을 실행하고 0 리턴 코드로 성공하면 다음 명령을 실행합니다.
  • 는 첫 번째 명령을 실행하고 제로 이외의 리턴 코드로 실패했을 경우 다음 명령을 실행함을 의미합니다.

파이프

파이프를 사용하여 명령을 연결할 수 있습니다. 그러면 한 명령어의 출력이 다음 명령어의 입력으로 공급됩니다.두 명령어가 동시에 실행됩니다.

  • stdout을 다음 명령어의 stdin에 접속하는 것을 의미합니다.셸 창에 아직 오류가 나타난다.
  • &stdout과 stderr를 모두 다음 명령어의 stdin에 연결하는 것을 의미합니다.

동시에 실행한다는 것은 "병행 중"을 의미합니다.멀티코어(멀티프로세서) 시스템에서는 피핑된 명령어가 문자 그대로 동시에 실행될 수 있습니다.그렇지 않으면 운영체제 내의 스케줄러는 이들 사이에 타임슬릭을 합니다.

명령어가 주어졌을 때, 예를 들어 "a b", 셸은 파이프를 생성하고 두 개의 파이프가 모두 시작됩니다.a그리고.b2개의 명령어 stdio를 리다이렉트 합니다.a파이프 입력에 stdout을 쓰는 동안b파이프 출력에서 stdin을 읽습니다.파이프는 운영체제에 의해 일정량의 버퍼링과 함께 구현되므로a파이프가 가득 찰 때까지 잠시 쓸 수 있지만 파이프가 가득 차면 OS 내에서 새로운 쓰기가 차단됩니다.b새로운 쓰기의 차단을 해제하기에 충분한 읽기입니다.한다면b사용 가능한 데이터보다 더 많은 데이터를 읽으려고 하면 다음 시간까지 차단됩니다.a더 많은 데이터를 작성했거나 파이프가 닫힐 때까지(예:a종료합니다.

변수 치환

단어에 달러 기호가 포함되어 있으면$", 다음 문자가 변수의 이름으로 사용되며 참조가 해당 변수의 값으로 대체됩니다.참조의 접미사로 입력된 다양한 편집 연산자는 경로 이름을 편집할 수 있습니다(예: " ").:e확장자만 추출합니다.) 및 기타 작업을 수행합니다.

견적 및 이스케이프

따옴표 메커니즘을 사용하면 공백, 와일드카드, 괄호 및 달러 기호와 같은 특수 문자를 리터럴 텍스트로 사용할 수 있습니다.

  • \다음 문자를 일반 문자 그대로 받아들인다는 의미입니다.
  • "스트링"약한 인용문입니다.괄호 안의 공백과 와일드카드는 리터럴로 간주되지만 변수와 명령어 치환은 계속 수행됩니다.
  • '스트링'강력한 인용문입니다.둘러싸인 문자열 전체가 리터럴로 간주됩니다.

명령어 대체

명령어 치환을 사용하면 어떤 명령어의 출력을 다른 명령어의 인수로 사용할 수 있습니다.

  • `명령어`명령어의 출력을 단어에 해석하여 명령줄에 붙여넣는 것을 의미합니다.

백그라운드 실행

보통 C 쉘은 명령어를 시작할 때 명령어가 완료될 때까지 기다렸다가 사용자에게 새로운 명령어를 입력할 수 있는 프롬프트시그널링을 보냅니다

  • 명령어 &는 백그라운드에서 start 명령어를 의미하며 새로운 명령어를 즉시 입력하도록 프롬프트됩니다.

서브셸

서브셸은 셸의 개별 하위 복사본으로 현재 상태를 상속하지만 부모에게 영향을 주지 않고 현재 디렉토리를 변경할 수 있습니다.

  • ( 명령어 )명령어를 서브셸로 실행함을 의미합니다.

제어 구조

C 쉘은 조건 테스트반복 모두를 위한 제어 구조를 제공합니다.조건 테스트 제어 구조는 if 문과 switch 문입니다.반복 제어 구조는 while, forach 및 repeat 문입니다.

if 스테이트먼트

if 문에는 두 가지 형식이 있습니다.짧은 형식은 한 줄에 입력되지만 식이 참일 경우 명령어를 하나만 지정할 수 있습니다.

if ( expression )명령어

long 형식은 명령어 블록을 조건 내에 네스트할 수 있도록 하기 위해 else 및 endif 키워드를 사용합니다.

if ( expression 1 )명령어 else ( expression 2 )명령어 ...else 명령어endif

else 키워드와 if 키워드가 같은 행에 표시되어 있는 경우, csh는 그것들을 네스트하지 않고 체인을 합니다.블럭은 1개의 endif로 끝납니다.

스위치 스테이트먼트

스위치 문은 와일드카드 문자를 포함할 수 있는 패턴 목록과 문자열을 비교합니다.일치하는 항목이 없는 경우 기본 액션이 수행됩니다(있는 경우 기본 액션이 있으면 기본 액션이 수행됩니다.

switch ( string ) case pattern 1 :명령어 breaksw case pattern 2 :명령어 breaksw ...기본값:명령어 breaks

while 스테이트먼트

while 문은 식을 평가합니다.true일 경우 셸은 중첩된 명령을 실행한 후 식이 true인 한 반복됩니다.

while ( expression )명령어종료됩니다.

포어치 스테이트먼트

foreach 문은 값 목록(일반적으로 와일드카드로 생성된 파일 이름 목록)을 가져와서 각각에 대해 루프 변수를 해당 값으로 설정하고 중첩된 명령을 실행합니다.

foreach loop-module ( list-of-values )명령어가 종료됩니다.

반복문

repeat 문은 단일 명령을 정수 횟수만큼 반복합니다.

repeat integer 명령어

변수

C 쉘은 셸 변수와 환경 [14]변수를 모두 구현합니다.환경변수, 를 사용하여 작성setenvstatement는 항상 단순한 문자열로, 모든 하위 프로세스에 전달되며, 하위 프로세스는 이러한 변수를 에 대한 인수를 통해 가져옵니다.

셸 변수, 를 사용하여 작성됩니다.set또는@C 쉘 내부 문입니다.하위 프로세스로 전달되지 않습니다.셸 변수는 단순 문자열 또는 문자열 배열 중 하나입니다.일부 셸 변수는 미리 정의되어 다양한 내부 C 셸 옵션(예를 들어 와일드카드가 일치하지 않을 경우 발생하는 동작)을 제어하기 위해 사용됩니다.

현재 버전의 csh에서는 문자열은 임의의 길이로 수백만 문자까지 사용할 수 있습니다.

표현.

C 쉘은 C에서 빌린 연산자를 사용하여 32비트 정수 표현 문법을 구현하지만 문자열 비교 및 파일 시스템 테스트(예: 파일 존재 테스트)를 위해 몇 개의 연산자를 추가합니다.연산자는 오퍼랜드와 공백으로 구분해야 합니다.변수는 다음과 같이 참조됩니다.$이름을 붙입니다.

연산자 precedence도 C에서 차용되지만 동일한 precedence 연산자의 시퀀스에서 가장 먼저 오는 것의 모호성을 해결하기 위해 다른 연산자 어소시에이티비티 규칙을 사용합니다.C에서는 대부분의 오퍼레이터에서 어소시에이티브는 왼쪽에서 오른쪽으로, C 쉘에서는 오른쪽에서 왼쪽으로입니다.예를들면,

// 왼쪽부터 C그룹 인트 i = 10 / 5 * 2; 인쇄물( %d\n", i ); // 인쇄 4 i = 7 - 4 + 2; 인쇄물( %d\n", i ); // 인쇄 5 i = 2 >> 1 << > 4; 인쇄물( %d\n", i ); // 인쇄 16 
# 오른쪽 @i = 10 / 5 * 2 echo $i # 인쇄1 @i = 7 - 4 + 2 echo $i # 인쇄1 @i = ( 2 >> 1 < 4 ) echo $i # 인쇄0

C 셸 예의 괄호는 비트 시프트 연산자가 I/O 리다이렉션 연산자로 혼동되지 않도록 하기 위한 것입니다.어느 언어에서도 괄호를 사용하여 원하는 평가 순서를 명확하게 지정할 수 있습니다(명확하게 하기 위해서라도).

접수처

Stephen Bourne 자신도 CSH가 자신의 셸보다 인터랙티브하게 [15]사용하는 것이 우수하다고 인정했지만 스크립팅에서는 그다지 인기가 있었던 적은 없었습니다.초기에는 1980년대까지 CSH가 모든 Unix 시스템에 존재한다고 보장할 수 없었지만 sh는 가능했기 때문에 다른 머신에서 실행해야 하는 스크립트에 적합합니다.1990년대 중반까지 csh는 널리 이용 가능했지만 스크립트에 csh를 사용하는 것은 POSIX 위원회로부터 새로운 비판에 직면했습니다.POSIX [16]위원회에서는 인터랙티브와 스크립팅의 목적 모두에 KornShell이라는 하나의 우선 셸만 존재해야 한다고 규정했습니다.C 쉘은 또한 C 쉘의 구문 결함, 기능 누락 및 구현 불량으로 인해 다른 사람들로부터 비난을[17][18] 받았습니다.

  • 구문 결함: 일반적으로 단순하지만 언어의 정의에 있어 불필요한 불일치입니다.예를 들어,set,setenv그리고.alias모든 명령어는 기본적으로 동일한 작업을 수행했습니다. 즉, 이름을 문자열 또는 단어 세트와 연관짓습니다.그러나 세 사람 모두 작지만 불필요한 차이가 있었다.에 등호가 필요했습니다.set을 위해서가 아니다setenv또는alias; 의 경우 단어 목록 주위에 괄호가 필요합니다.set을 위해서가 아니다setenv또는alias, 등. 마찬가지로if,switch및 루프 구성에서는 불필요하게 다른 키워드를 사용합니다(endif,endsw그리고.end)를 사용하여 네스트된 블록을 종료합니다.
  • 누락된 기능: 일반적으로 stdio 파일 핸들을 독립적으로 조작할 수 없고 기능을 지원하지 않는다는 점을 들 수 있습니다.에일리어스는 기능을 지원하지 않지만 회피책으로 사용됩니다.여러 줄의 코드의 경우 에일리어스는 작은 따옴표 안에 있어야 하며 각 줄의 끝은 백슬래시 앞에 있어야 합니다(에일리어스의 끝을 구분하려면 마지막 줄의 끝은 단일 따옴표 앞에 있어야 합니다).
  • 애드혹 파서를 사용한 구현은 가장 심각한 비난을 받고 있다.1970년대 초까지 컴파일러 기술은 충분히[19] 성숙하여 대부분의 새로운 언어 구현은 완전히 재귀적인 문법을 인식할 수 있는 하향식 또는 상향식 파서를 사용했다.C 쉘 대신 애드혹설계를 선택한 이유는 밝혀지지 않았습니다.Joy가 2009년 인터뷰에서 말한 것처럼 "유닉스와 함께 이 작업을 시작했을 때 저는 훌륭한 [20]프로그래머가 아니었습니다."애드혹 설계는 C 쉘 언어가 완전히 재귀적이지 않음을 의미합니다.명령어를 얼마나 복잡하게 처리할 수 있는지에 한계가 있었습니다.

대부분의 인터랙티브하게 입력된 명령어에서는 동작하지만 사용자가 스크립트에 쓸 수 있는 보다 복잡한 명령어에서는 오류가 발생하기 쉬우며 알 수 없는 오류 메시지 또는 반갑지 않은 결과만 발생합니다.예를 들어 C 쉘은 제어 구조물 간의 배관을 지원할 수 없었다.의 출력을 파이프로 연결하려고 합니다.foreach명령하여 하게 하다.grep(파서와 관련된 불만사항의 많은 부분에 대해 유효한 회피책은 코드를 다른 스크립트로 분할하는 것입니다.이 경우,foreach는 다른 스크립트로 이동되며 올바른 stdio 핸들을 상속하는 새로운 csh 복사본을 포킹함으로써 스크립트가 실행되기 때문에 파이핑이 기능합니다.)

또 다른 예로는 다음 fragment의 반갑지 않은 동작이 있습니다.이 두 가지 모두 "'myfile'이 존재하지 않는 경우 'mytext'를 작성하여 작성하십시오."를 의미하는 것으로 보입니다.그러나 오른쪽 버전에서는 항상 빈 파일이 생성됩니다.C 쉘의 평가 순서는 각 명령줄에서 I/O 리다이렉션 연산자를 읽고 그 연산자를 검색 및 평가한 후 나머지 행에 제어 구조가 포함되어 있는지 확인하는 것이기 때문입니다.

# if ( !-e myfile ), echo mytext > myfile endif)의 순서동작합니다.
# (!-e myfile)mytext > myfile을 에코할 경우 항상파일만듭니다.
# (! -e myfile) eval "echo mytext > myfile"의 경우의 회피책(tcsh의 경우에만 해당)

구현은 또한 "0 event not found"와 같은 악명 높은 오류 메시지로 인해 비판받기도 합니다. 이 오류 메시지는 문제에 대한 유용한 정보를 찾을 수 없습니다.

그러나 연습을 함으로써 이러한 결점을 극복할 수 있습니다(따라서 프로그래머에게 스크립트 구현에 대해 더 좋고 안전한 접근법을 취하도록 지시합니다).

# 두 번째 회피책( cshtcsh용) ( ( : < myfile )> & / dev / null & echo File   echo mytext > myfile ) > & / dev / null & echo File created  ) 。

영향을 주다

Windows 7 데스크톱의 64비트 Hamilton C .

C 쉘은 이력 메커니즘, 에일리어스, 칠드 표기법, 인터랙티브 파일 이름 완성, 셸에 내장된 표현식 문법 등을 포함한 많은 혁신 기술을 도입하는 데 매우 성공적이었습니다.그러나 ksh와 bash를 포함하여 독립적으로 개발된 클론을 대량으로 생성한 sh와는 대조적으로 2개의 csh 클론만 알려져 있습니다(tcsh는 원래 Bill Joy에 의해 작성된 csh 코드를 기반으로 했기 때문에 클론으로 간주되지 않습니다).

1986년 Allen Holub은 On Command를 썼다. MS-DOS용 [21]Unix-Like Shell을 쓰는 것. 이 책은 그가 "SH"라고 불렀지만 실제로는 sh가 아닌 csh의 언어 디자인과 특징을 베낀 것을 기술한 이다.SH와 Unix와 유사한 유틸리티의 기본 세트(cat, cp, grep 등)를 포함한 컴패니언 디스켓은 각각 $25, $30에 출판사에서 구할 수 있었습니다.Holub의 SH에 있는 제어 구조, 표현 문법, 이력 메커니즘 및 기타 특징은 C 쉘과 동일했다.

1988년 Hamilton Laboratories는 OS/[22]2용 Hamilton C 을 출하하기 시작했습니다.여기에는 csh 클론과 Unix와 유사한 유틸리티 세트가 모두 포함되어 있습니다.1992년에 해밀턴 C 쉘이 Windows [23]NT용으로 출시되었습니다.Windows 버전은 계속 지원되고 있지만 OS/2 버전은 [23]2003년에 단종되었습니다.1990년 초의 퀵[24] 레퍼런스에서는, 「C 쉘 언어 전체의 컴플리언스(작업 제어 제외)」라고 하고 있습니다만, 언어 설계의 개선과 Unix 와 PC 의 차이에의 적응을 목적으로 하고 있습니다.가장 중요한 개선점은 제어 구조를 네스트 또는 파이핑할 수 있는 하향식 파서입니다.이것은 애드혹 파서에서는 원래 C 쉘에서는 지원되지 않는 것입니다.해밀턴은 또한 내장 및 사용자 정의 프로시저, 블록 구조화된 로컬 변수 및 부동 소수점 산술 등 새로운 언어 기능을 추가했습니다.PC로의 적응에는 PC에서의 파일명 및 기타 규칙 지원, 파이프라인 셋업 등 병렬화를 실현하기 위해 포크 대신 스레드 사용(OS/2 또는 Windows에서는 사용할 수 없음)이 포함되었습니다.

「 」를 참조해 주세요.

레퍼런스

  1. ^ Zoulas, Christos (24 November 2016). "tcsh-6.20.00 is now available!". mx.gw.com. Archived from the original on 25 November 2016. Retrieved 24 November 2016.
  2. ^ 할리 한, Unix and Linux에 대한 할리 한의 가이드.
  3. ^ Berkeley Engineering Lab Notes, Volume 1, 제2호, 2001년 10월, 2010년 7월 9일 Wayback Machine에 아카이브.
  4. ^ 조이의 C 쉘 소개
  5. ^ Ubuntu - 패키지 CSH 상세.Packages.ubuntu.com 를 참조해 주세요.
  6. ^ Debian - 패키지 CSH 상세.Packages.debian.org 를 참조해 주세요.
  7. ^ Ubuntu - 패키지 tcsh 상세.Packages.ubuntu.com 를 참조해 주세요.
  8. ^ Debian - 패키지 tcsh 상세.Packages.debian.org 를 참조해 주세요.
  9. ^ Ken Greer (3 October 1983). "C shell with command and filename recognition/completion". Newsgroup: net.sources. Retrieved 29 December 2010.
  10. ^ tcsh(1) man 페이지tcsh.
  11. ^ 2000년 6월 17일 tcsh-17의 파일을 수정합니다.
  12. ^ 후기 블로머는 1989년 12월 17일 영국 UCW Aberystwyth, CS부의 Piercarlo "Peter" Grandi에 의한 USENET의 투고에 재방문했다.
  13. ^ '빵빵' 발음
  14. ^ Troy, Douglas (1990). UNIX Systems. Computing Fundamentals. Benjamin/Cumming Publishing Company. p. 25.
  15. ^ Bourne, Stephen R. (October 1983). "The Unix Shell". BYTE. p. 187. Retrieved 30 January 2015.
  16. ^ IEEE 정보기술 표준, 휴대용 운영체제 인터페이스(POSIX), Part 2: 유틸리티, Volume 2. IEEE 규격 1003.2-1992, 페이지 766-767.ISBN 1-55937-255-9.
  17. ^ Csh 프로그래밍이 Tom Christiansen에 의해 유해하다고 간주됨
  18. ^ Bruce Barnett의 C 쉘을 사용하지 않는 10가지 이유
  19. ^ David Gries(1971년).디지털 컴퓨터용 컴파일러 구조.John Wiley & Sons.ISBN 0-471-32776-X
  20. ^ Bill Joy in Conversation with Brent Schlender, Churchill Club, 캘리포니아 산타클라라, 2009년 2월 11일 Wayback Machine에서 2010년 3월 30일 아카이브.
  21. ^ Holub, Allen (1986–1987). On Command: Writing a Unix-Like Shell for MS-DOS (Second ed.). M&T Books, Redwood City, CA. ISBN 0-934375-29-1.
  22. ^ Hamilton, Douglas. "Hamilton C shell Announcement" (PDF). IBM Personal Systems Developer (Summer 1989): 119–121. Retrieved 11 July 2020.
  23. ^ a b Hamilton, Nicole (5 March 2017). "Hamilton C shell for Windows Release Notes 5.2.g". Hamilton Laboratories, Redmond, WA. Retrieved 3 April 2018.
  24. ^ Hamilton C shell Quick Reference (PDF). Hamilton Laboratories, Wayland, MA. 1988–1990. Retrieved 11 July 2020.

추가 정보

외부 링크