2019년 10월 11일 금요일

`...`과 $(...)을 사용한 command substitution, 그리고 process substitution

표준 QWERTY 키보드에서 숫자 1의 왼쪽에 있는 키를 누르면 `가 찍힌다. 아래의 그림에서 왼쪽 위 모서리에 있는 키 말이다. `는 backtick, grave accent 또는 어려운 한자어로는 억음 (抑音)부호라고 부른다.


Bash에서는 이것으로 어떤 명령어를 둘러싸면(`command`) 그 출력물을 바꾸어서 내어 놓는다. 가독성을 높이기 위해 요즘은 $(command)로 대체하는 추세라고 한다. 이를 command substitution이라 한다. 내가 바이블처럼 읽는 Mark G. Sobell의 A Practical Guide to the Unix System 3판(발간된 해인 1995년에 구입함)에서 처음 접한 것이 `command` 방식이라서 $(command) 방식을 처음 보고는 이게 도대체 무엇인지를 몰라서 의의하게 생각했었다.

Sobell 선생께서는 은퇴를 하셨는지 블로그에는 2012년 3월을 마지막으로 새 글이 없다. 트위터 계정도 갖고 계시다.

제목과는 다른 주제가 되겠지만 리다이렉션은 종종 혼동을 초래한다. 이런 것은 이해하는데 아무런 문제가 없다.

$ ls > file.txt

하지만 이것은 어떠한가?

$ join <(sort file1.txt) <(sort file2.txt)

틀림없이 파일이 인수명으로 있어야 할 위치에 <(command)가 위치하였다. 무슨 의미인지는 어렴풋하게 이해할 수 있다. 괄호안에 위치한 명령어의 표준출력이 이름 없는 파일에 먼저 쓰여지고, 이 파일이 join 명령어의 인수로 작용하는 것으로 생각하면 된다. 이러한 용법을 bash 매뉴얼에서는 무엇이라고 하는가? 찾아보니 process substitution이라고 부른다. 매뉴얼에서는 <(list) 또는 >(list)의 용법이 있다고 설명을 하였다. 구글에서 국문으로 프로세스 치환을 검색하니 KLDP의 웹페이지를 제외하면 별다른 정보가 없지만, 영문 검색으로는 많은 사례가

그러면 >(list)는 무엇을 뜻할까? 이것은 조금 더 어렵다. 문제는 process substitution이 POSIX 표준을 준수하지는 않는다는 것이다(참조 링크).


이해는 약간 되는 듯하지만 다른 사람에게 설명을 하라면 아직 부족하다. 내가 머리가 나쁜 것인가? 흠...

댓글 없음: