리눅스2023. 8. 15. 18:35

 

반달가면 이글루에서 백업 - http://bahndal.egloos.com/623882 (2019.1.24)

제목이 약간 복잡한데, 좀 더 자세히 설명해 보자면 이렇다. 인자(argument)로 파일명을 입력 받아서 작업을 하는 프로그램/스크립트가 있는데, 파일 대신에 터미널창의 출력(표준출력)을 파이프(|)로 넘겨서 마치 파일의 내용인 것처럼 입력하고 싶은 경우다.

좀 억지스럽긴 하지만, 편의상 예를 들어 test.sh 스크립트의 내용이 아래와 같다고 해 보자.

# test.sh 내용
cat test.sh
file "$1"
cat "$1"

위 스크립트의 내용을 보면 file 명령어로 파일 종류를 식별하여 출력한 후에 cat 명령어로 해당 파일의 내용을 출력하는 것임을 알 수 있다.

# test.sh 실행 예시
bash test.sh my_doc.pdf
my_doc.pdf: PDF document, version 1.3

파일이 들어갈 자리에 문자열이 파이프를 통해 넘어갈 경우 당연히 오류가 발생할 것이다.

# 오류 발생
echo "abcd" | bash test.sh
ERROR: cannot open...

위의 상황에서 파이프로 넘겨받은 것이 문자열이 아니라 해당 문자열을 내용으로 담은 파일인 것처럼 보이게 할 수 있다. 파일이 들어갈 인자(argument) 위치에 /dev/stdin을 지정해 주면 된다. 아래의 예시를 보자.

# 파일 대신 /dev/stdin 사용
echo "abcd" | bash test.sh /dev/stdin
/dev/stdin: symbolic link to `/proc/self/fd/0'
abcd

/dev/stdin이 표준입력(stdin)에 대응하는 파일 디스크립터(file descriptor)에 대한 심볼릭 링크로 인식되므로 파일이 들어갈 자리에 문제 없이 들어가고, 내용은 앞에서 파이프로 받은 것이 되어 오류가 없이 스크립트가 실행됨을 볼 수 있다.

평소에 자주 쓸 일을 없으나, 파일을 입력으로 받는 프로그램이나 스크립트에 대해서 파일에 담긴 내용에 따라 어떻게 결과 출력이 변하는지 반복적으로 시험해 볼 때 요긴하게 활용중.

728x90
Posted by 반달가면