파일에서 입력을 받는 프로그램이 있는데 XML
파일 경로가 매개변수로 지정됩니다. 나는 내 쉘 스크립트가 독립적이기를 원하므로 여기에 있는 문서가 올바른 접근 방식인 것 같습니다. 불행하게도 프로그램은 의 입력을 받아들이지 않으므로 STDIN
파이프가 작동하지 않습니다.
나는 여기에서 문서를 읽었습니다. 문서는 파일로 구현되어 있으므로 /tmp
방법이 있을 수 있다고 생각했습니다.
내 XML 파일을 내 쉘 스크립트에 인라인하고 XML 파서가 사용할 수 있는 경로를 얻는 방법이 있습니까?
답변1
쉘이 프로세스 대체(bash, zsh, ksh88, ksh93)를 지원하는 경우 다음을 사용할 수 있습니다.
your_command <( cat <<EOF
contents of the
xml file
EOF
)
이 전체 <(...)
섹션은 명령의 출력을 cat <<EOF
FIFO에 연결한 다음 현재 명령에 인수로 전달됩니다.
하지만 좀 더 이식성이 뛰어난 방법은 내용이 포함된 임시 파일을 만든 다음 삭제하는 것입니다.
답변2
여기에서 셸이 문서를 구현하는 방식은 셸마다 다르며, 뒤에서 사용되는 내용은 런타임 요소에 따라 달라질 수 있습니다. 예를 들어, 쉘은 bash
시스템 파이프 크기보다 짧은 문서를 처리하기 위해 쉘 프로세스 내부의 파이프를 사용하려고 시도합니다.
/dev/fd/0
대부분의 Unix 시스템에서 읽음으로써 표준 입력 스트림에 액세스할 수 있습니다 /dev/stdin
. 이러한 기능이 사용 가능하다는 보장은 없지만 오늘날 가장 일반적으로 사용되는 Unix 시스템에서는 이를 구현합니다.
표준 입력 스트림에 데이터를 제공하면서 이러한 경로 이름 중 하나를 사용하여 명령에 경로 이름을 제공하면 문제가 해결됩니다.
thecommand /dev/stdin <<'END_XML'
Some XML document
goes here.
END_XML
/dev/stdin
명령이 특정 파일을 검색할 필요가 없는 한 이와 같이 사용하면 작동합니다. 그렇다면 임시로 실제 파일에 입력을 쓸 수 있습니다.
tmpfile=$(mktemp) || exit
cat <<'END_XML' >"$tmpfile"
Some XML document
goes here.
END_XML
thecommand "$tmpfile"
rm "$tmpfile"
이러한 특수 경로 이름 중 하나와 함께 이 문서를 사용하는 것은 다음과 같은 다른 명령에 임시 입력을 제공하는 편리한 방법이기도 합니다.
sed -f /dev/stdin file <<'END_SED'
Some sed script
goes here
END_SED
답변3
인터프리터는 해석되는 소스에서 "여기" 문서를 읽고 이를 입력을 가져오는 명령에 입력하는 방식으로 잘 작동합니다(임시 파일을 사용하는 번거로움을 피하기 위해 어쨌든 제가 하는 일입니다). 그럼에도 불구하고 어떤 메커니즘을 사용하든 문서화되지 않은 것 같으므로 언제든지 변경될 수 있습니다. 특히, 다른 쉘이 /bin/sh
동일한 방식으로 작동한다는 보장은 없습니다 .
답변4
-
한 가지 방법은 아래와 같이 stdin 및 heredocs의 약식 형식을 사용하는 것입니다.
command - <<EOF
<file>
<contents />
</file>
EOF