![쉘은 이 문서에 포함된 내용을 어떻게 확장합니까?](https://linux55.com/image/108640/%EC%89%98%EC%9D%80%20%EC%9D%B4%20%EB%AC%B8%EC%84%9C%EC%97%90%20%ED%8F%AC%ED%95%A8%EB%90%9C%20%EB%82%B4%EC%9A%A9%EC%9D%84%20%EC%96%B4%EB%96%BB%EA%B2%8C%20%ED%99%95%EC%9E%A5%ED%95%A9%EB%8B%88%EA%B9%8C%3F.png)
특정 지점에 대한 정보를 어디에서도 찾을 수 없었기 때문에 왜곡된 쉘 논리 사례를 제출해야 합니다(놓친 경우 사과드립니다). 맥락을 설명하려고 노력하겠습니다.
첫 번째 항목이 있고 구분 기호를 사용하여 두 번째 항목을 생성 scriptA
하고 싶습니다 . 나는 이 heredoc에 파일 포함과 일부 로컬 변수 (예: 확장용 )라는 scriptB
두 가지 항목을 포함하고 싶습니다 . 예는 다음과 같습니다.my_source
scriptA
scriptA
스크립트 A:
#!/bin/sh
logfile=/path/to/my_logfile
scriptB=/path/to/my_script
cat > ${scriptB} << __EOF__
. /path/to/my_source #this is a shell script
echo "Some text" | tee -a ${logfile}
__EOF__
위 코드 조각에 대한 내 질문은 다음과 같습니다. .
명령에 대한 셸 확장(즉, 포함)이 my_source
내부에서 발생합니까 scriptA
아니면 외부에서 발생합니까 scriptB
?
보너스: 어떻게든 일부를 지정할 수 있나요?부분여기 문서를 확장하면 안 되나요?
참고: 여기서는 POSIX를 준수하고 bash 세부 정보를 피하려고 노력하고 있습니다.
귀하의 통찰력에 감사드립니다!
편집: 대답은 .
여기 문서에서 유틸리티가 실행되어서는 안 된다는 것입니다 scriptA
. 여기에 있는 문서에서는 다음 작업만 수행하기 때문입니다.
매개변수 확장, 명령 대체, 산술 확장
이것은 .
확장이 없는 쉘 전용 내장 유틸리티입니다(bash, ksh, tcsh 전용(...) 내장을 포함한 모든 쉘 내장 유틸리티와 같습니다).
통찰력을 주신 @ilkkachu에게 감사드립니다.
답변1
아니요, 여기 문서는 크게 확장되었습니다.큰따옴표로 묶인 문자열과 같습니다.:
단어의 일부가 인용되지 않은 경우 여기에 있는 문서의 모든 행은 매개변수 확장, 명령 대체 및 산술 확장을 위해 확장되어야 합니다.
백슬래시를 사용하여 특수 문자를 이스케이프할 수도 있습니다.
인용에 대한 참고 사항은 이와 같은 내용으로 인해 <<"EOF"
여기 문서의 내용이 확장되지 않는다는 의미입니다. 귀하의 예에서 ${logfile}
쉘은 입력을 에 전달하기 전에 참조를 확장합니다 cat
.
명령의 출력을 포함하려는 경우에도 명령 대체를 사용할 수 있지만, 그게 전부라면 파이프를 사용하는 것도 합리적인 옵션입니다.
답변2
Heredoc은 재해석하지 않습니다. 즉, Heredoc은 그 안에 있는 어떤 명령도 실행하지 않는다고 말할 수 있습니다. 문자열을 삽입하기만 하면 됩니다.
따라서 귀하의 쿼리에 대한 대답은 -ing이 source
구분된 문서 내에서는 발생하지 않는다는 것입니다.
후자의 \
경우 백슬래시를 사용하여 문서를 구분하여 확장하고 싶지 않은 문자의 의미를 끌 수 있습니다.
답변3
매우 오래된 내용이라는 것을 알고 있지만 검색 중에 발견하여 다른 사람들을 위해 수정하고 싶었습니다.
여기에 있는 문서에서는 역따옴표 `로 명령 대체를 사용하거나 일반적인 $() 표기법을 사용할 수 있습니다. 따라서 귀하의 경우에는 $(. ./my_source)를 사용하여 my_source 파일을 얻을 수 있습니다.
그러나 귀하의 설명에 따르면 귀하는 실제로 my_source 파일을 얻고 싶지 않은 것으로 보입니다. 이 게시물에 대한 내 해석은 귀하의 의도가 my_source 파일을 실행하는 것이 아니라 my_source 파일의 내용을 포함하는 것이며 이로 인해 stdout이 ScriptB에 병합될 수 있습니다.
posix 표준을 준수하려면 대신 cat 명령을 사용하십시오.
#!/bin/sh
logfile=my_logfile
scriptB=my_script
cat > ${scriptB} << __EOF__
$(cat my_source) #this is a shell script
echo "Some text" | tee -a ${logfile}
__EOF__
명령 대체는 서브쉘을 생성하므로 bashism에 문제가 없다면 전체 파일을 변수로 읽고 일반 인수로 확장하면 됩니다.
#!/bin/bash
logfile=my_logfile
scriptB=my_script
IFS="" read -r -d '' my_source_var < my_source
cat > ${scriptB} << __EOF__
${my_source_var} #this is a shell script
echo "Some text" | tee -a ${logfile}
__EOF__