반달가면 이글루에서 백업 - 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)에 대한 심볼릭 링크로 인식되므로 파일이 들어갈 자리에 문제 없이 들어가고, 내용은 앞에서 파이프로 받은 것이 되어 오류가 없이 스크립트가 실행됨을 볼 수 있다.
평소에 자주 쓸 일을 없으나, 파일을 입력으로 받는 프로그램이나 스크립트에 대해서 파일에 담긴 내용에 따라 어떻게 결과 출력이 변하는지 반복적으로 시험해 볼 때 요긴하게 활용중.
'리눅스' 카테고리의 다른 글
MX 리눅스(MX Linux) 18.1 - 한글 입력 기능 추가 (0) | 2023.08.17 |
---|---|
chmod - 리눅스에서 특정 디렉토리 하위의 모든 디렉토리/파일에 대한 권한 설정 (0) | 2023.08.15 |
우분투 14.04 기반 클라이언트에서 우분투 18.04 기반 NFS 서버에 접속하는 문제 (0) | 2023.08.15 |
리눅스 민트에서 NFS 서버 설정 (0) | 2023.08.11 |
sshpass - ssh 자동접속 (0) | 2023.08.11 |