Computer >> 컴퓨터 >  >> 프로그래밍 >> Bash 프로그래밍

여러 해가 지나도 여전히 tcsh를 사랑하는 이유

나는 스스로를 만족스러운 Bash 사용자라고 생각합니다. 하지만 유닉스를 처음 접했을 때는 tcsh가 기본 셸로 제공되는 상용 유닉스 시스템이었기 때문에, 저의 초기 셸 경험은 최신 버전의 C 셸(csh)에서 시작되었습니다. 이것은 결과적으로 행운의 우연이었는데, 제 커리어 후반에 일했던 영화 스튜디오에서도 tcsh가 선호하는 셸이었기 때문입니다.

지금까지도 논리적 연관성은 없지만 몇 가지 작업은 tcsh와 연관 지어 생각하게 됩니다. 적어도 하나의 시스템에서는 감을 잃지 않기 위해 여전히 tcsh를 사용하고 있습니다. 또한 모든 시스템에 tcsh를 설치해 두어 직접 작성한 tcsh 스크립트와의 호환성을 유지하고, tcsh로 작성하는 편이 더 좋다고 판단되는 스크립트를 작성할 때 바로 실행할 수 있도록 하고 있습니다.

C 셸과 Bash의 차이

Tcsh는 csh의 현대적인 계보입니다. 1978년 C 셸이 처음 공개되었을 때, 사용자들은 C와 유사한 문법에 큰 열광했습니다. 당시 C는 새로운 프로그래밍 언어였고, 무엇보다 유닉스 자체가 C로 작성된 언어였기 때문에 대부분의 유닉스 사용자들은 낯선 스크립팅 언어보다 C에 훨씬 익숙했습니다. 예를 들어 Bash에서 다음 if 루프는 조건문(대괄호 안의 부분)을 평가하기 위해 test 바이너리를 "몰래" 호출합니다:

v=1

if [ $v -gt 0 ]
  then
  echo "verbose"
fi

다음은 csh나 tcsh에서 동일한 문장입니다. 조건문(괄호 안의 코드)이 csh의 내장 평가 기능을 사용하기 때문에 외부 test 호출이 필요하지 않습니다:

set v=1

if ($v > 1) then
  echo "verbose"
endif

이 예시는 장단점을 모두 보여줍니다. C 프로그래머에게 괄호로 조건식을 감싸는 것은 자연스러운 일이며, 프로그래머 관점에서 수학 연산이 실행 파일에 내장되어 있는 것은 바람직합니다. 반면 if 루프 문법은 구분자로 중괄호를 사용하는 C보다는 오히려 Lua와 더 비슷합니다:

// this does not work in Csh
if ( v>1 ) {
        printf("verbose");
}

어떤 면에서 이것은 csh를 잘 요약해 줍니다. 깔끔하고 효율적이며 어떤 사람들에게는 친숙하지만, 동시에 기묘하고 일관성이 없는 셸입니다.

그렇다면 왜 사용할까요?

정밀함을 위한 Tcsh

저는 C 코드보다 C++과 Java를 더 많이 작성하기 때문에, tcsh에 대한 저의 애정은 역사적으로 유명했던 이유와는 거리가 있습니다. 하지만 저는 Lua를 좋아하며, 어느 의미에서 tcsh와 다른 셸들을 Lua와 Python, 혹은 Markdown과 Docbook처럼 생각합니다. 두 셸 모두 나름의 장점이 있고, 어느 쪽이 더 인기 있는지는 쉽게 짚을 수 있지만, 다른 한쪽에는 엄격한 명료함이 있습니다. 실제로 저는 tcsh가 많은 다른 셸들이 갖추지 못한 정밀함을 지니고 있다고 느낍니다.

변수

셸에서는 타입이 지정된 변수의 편리함을 누릴 수 없지만, tcsh에서는 적어도 키워드로 변수를 선언할 수 있습니다. 이상하게도 이 작업에 사용할 수 있는 키워드가 여러 개 있지만, 제가 선택한 것은 set이었습니다:

> set var=foo
> echo $var
foo

변수 이름(위 예시에서는 var)을 입력한 후 Ctrl+X를 누르고 이어서 $(달러) 키를 누르면 변수를 확장할 수 있습니다. 위 예제는 varfoo로 설정합니다.

다른 많은 셸과 마찬가지로, 인수 없이 set만 입력하면 설정된 모든 변수를 나열할 수 있습니다:

> set
term    xterm
tty     pts/2
uid     1000
user    seth
var     foo
[...]

unset 명령으로 변수를 해제할 수 있습니다:

> unset var
> set | grep var

기능이 없다는 것 자체가 기능이다

아마도 스크립트에서 다음과 같은 줄을 본 적이 있을 것입니다:

var=GitLab
${var,}

두 번째 줄은 var의 내용을 소문자로 변환하는 내장 함수입니다.

이런 추가 함수들은 무척 유용하지만, 때로는 코드를 알아보기 어렵게 만드는 초대장처럼 느껴질 때가 있습니다. 셸 스크립팅은 프로그래밍 세계의 HTML과 같습니다. 다른 사람의 코드를 읽는 것만으로 독학할 수 있는 몇 안 되는 진지한 언어 중 하나입니다. 유용한 함수를 포기해야 할 좋은 이유는 아니지만, 다양한 언어에서 유행하는 암호 같은 축약 표현을 피하려는 이유이기는 합니다. tcsh로 작성할 때는 그만큼 축약 표현을 쓸 수 없기 때문에, 복잡한 문자열 연산은 내장 단축 기능이 아닌 기본 유닉스 도구로 수행해야 합니다. 그 결과 코드가 더 읽기 쉬워진다고 믿으며, 이는 미래의 기여자들에게, 그리고 미래의 건망증 있는 저 자신에게 큰 차이를 만듭니다.

내장 수학 연산

tcsh에서 제가 사랑하는 것 중 하나는 내장된 @ 수학 단축 명령입니다. 독학으로 유닉스를 배운 대부분의 사람들처럼 저도 우연히 bc를 발견했고, 그 후로 계속 후회하고 있습니다. bc 자체의 잘못은 아니지만, bc는 사실 계산 언어로 더 적합한데도 종종 명령줄 계산기로 가르쳐집니다. 대안으로는 순수 Bash로 작성된 놀라운 300줄짜리 계산기, Bash의 let 명령, 혹은 tcsh의 @ 명령이 있습니다.

> @ n = ( 1 + 1 / 2 )
> echo $n
1

매우 복잡한 수학 연산이라면 bc나 좋은 Python 수학 라이브러리를 배우는 편이 나을 수 있습니다.

필수적인 모든 것

저에게 tcsh는 극도의 단순함과 필수 기능 사이의 완벽한 균형점입니다. 모든 사용자를 위한 셸도, 모든 용도를 위한 셸도 아니지만, 텍스트 기반 세계를 바라보는 시야를 단순화하고 싶다면 tcsh가 흥미로운 대안이 될 수 있습니다.