Linux 쉘 스크립트의 Heredoc에서 날짜 명령이 인쇄되지 않습니다.

Linux 쉘 스크립트의 Heredoc에서 날짜 명령이 인쇄되지 않습니다.

구분된 문서 내에서 날짜를 인쇄하려는 쉘 스크립트가 있습니다. 아래는 코드 조각입니다.

echo "This is a text"
echo I want date to print inside heredoc <<EOF
var1=`date`
echo $var1
EOF
echo "Thats All"

위 코드의 출력은 다음과 같습니다.

I want date to print inside heredoc
Thats All

날짜를 인쇄하지 않습니다. echo 명령을 입력해도 인쇄되지 않습니다. 여기에 뭔가 문제가 있을 수 있습니다.

참고: 여기 코드에 다음을 추가하려고 했습니다.___EOF -- 작동하지 않음 'EOF' -- 작동하지 않음

제안해주세요.

이것은 다른 사용자로 전환한 다음 그곳에서 일부 작업을 수행해야 할 때의 실제 코드입니다.

su - oracle << EOF
echo $(xyz file.prop) > replace.txt
var1=`cat replace.txt_orig`
var2=`cat replace.txt`

echo $var1
echo $var2
EOF

변수 할당과 에코는 여기서 아무런 영향을 미치지 않습니다.

답변1

Heredocs는 파일 설명자가 지정되지 않는 한 STDIN으로 읽혀지지만 echostdin(또는 fd)에서는 읽혀지지 않습니다.

또한 명령 대체 및 매개변수 확장은 구분된 문서 내에서 작동하지만(단어에 따옴표가 없는 한 << WORD) 변수 할당은 작동하지 않으며 문서 외부에서는 명령 대체도 작동하지 않습니다.

여기서 궁극적으로 달성하려는 것이 무엇인지 잘 모르겠습니다. XY 문제인 것 같지만 cat이것을 사용하여 heredoc를 읽을 수 있으며 예상대로 작동합니다.

var1=$(date)
cat <<EOF
$var1
EOF

또는 간단하게:

cat <<EOF
$(date)
EOF

답변2

xyz출력으로 생성하기 전에 명령 결과나 파일 내용을 변수로 읽어올 필요가 없기 때문에 이 문서에서는 변수 할당이나 명령 대체가 필요하지 않습니다.

su - oracle <<'END_SU_SCRIPT'
xyz file.prop >replace.txt
cat replace.txt_orig
cat replace.txt
END_SU_SCRIPT

쉘을 호출하는 데 필요한 확장이 없기 때문에 여기서 참조된 문서를 사용하기로 결정했습니다.

문서의 셸 확장 내용은 여기 원본 문서의 문제였습니다. 여기에서는 문서가 인용되지 않았기 때문에 쉘을 호출하면 마치 큰따옴표로 묶인 문자열인 것처럼 문서의 모든 확장이 확장됩니다. 따라서 명령 대체는 around 및 변수 $(xyz file.prop)대체와 마찬가지로 확장됩니다 . 이 모든 일이 발생합니다 .cat$var1$var2앞으로전화도 걸어보세요 su.

관련 정보