쉘은 이 문서에 포함된 내용을 어떻게 확장합니까?

쉘은 이 문서에 포함된 내용을 어떻게 확장합니까?

특정 지점에 대한 정보를 어디에서도 찾을 수 없었기 때문에 왜곡된 쉘 논리 사례를 제출해야 합니다(놓친 경우 사과드립니다). 맥락을 설명하려고 노력하겠습니다.

첫 번째 항목이 있고 구분 기호를 사용하여 두 번째 항목을 생성 scriptA하고 싶습니다 . 나는 이 heredoc에 파일 포함과 일부 로컬 변수 (예: 확장용 )라는 scriptB두 가지 항목을 포함하고 싶습니다 . 예는 다음과 같습니다.my_sourcescriptAscriptA

스크립트 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__

관련 정보