이 문서에서 "$"를 인쇄하는 방법


43

bash의 here-doc에서 "$"를 에코하는 방법은 무엇입니까?

예를 들어, 원격 서버의 내용이있는 파일을 원합니다 $ABC=home_dir.

$ ssh hostname sudo -s <<EOF
echo "$ABC=home_dir" > file
EOF

그러나 변수로 취급됩니다. 리터럴을 $어떻게 인쇄 할 수 있습니까?


2
작은 따옴표를 사용할 수 있습니다
Rahul Patil

2
그것은 많은 간접적 인 일입니다. 로컬 호스트에서 파일을 작성한 다음 파일을 작성할 scp수 없습니까?
l0b0

답변:


65

here-doc을 작성하고 doc을 확장하거나 특수 문자를 해석하지 않으려면 다음과 같이 작은 따옴표로 레이블을 인용하십시오.

$ cat >file <<'EOF'
echo "$ABC=home_dir"
EOF

그러나 예제에 설명 된 상황은 실제로 ssh를 통해 원격 시스템 으로이 내용을 전송하여 쉘을 호출하는 sudo에 의해 실행되기 때문에 쉘이 내용을 확장하기 때문에 훨씬 복잡합니다. 게다가). 이 권리를 얻으려면 더 많은 인용문이 필요하지만 sudo에는 터미널이 필요하므로 (암호를 요청할 수 있음) stdin에서 리디렉션되었으므로 여전히 작동하지 않습니다. 사용하더라도 ssh -t여기에 도움이되지 않습니다.

또한 Johan에 동의합니다. 이것이 실제로 원하는 것인지 확실하지 않습니다. 쉘 변수 참조에 값을 할당하는 것은 합법적이지 않으므로 작성하려는이 파일이 쉘 스크립트 인 경우 설명 된대로 작동하지 않습니다. 약간 백업하고 실제로 원하는 것을 설명하면 더 많은 도움을 줄 수 있습니다.


이것은 매우 긴 문서를 제공 할 수 있기 때문에 가장 좋은 대답입니다. 그것은 (대부분) 바보 증거입니다.
Felipe Alvarez

23

탈출 $

$ ssh hostname sudo -s <<EOF
echo "\$ABC=home_dir" > file
EOF

나는 당신의 유스 케이스가 무엇인지 모르지만 일반적으로 home_dir=$ABC대신에 당신이 원합니다 $ABC=home_dir.


2
이 솔루션은 작동하지만 OP가 원하는 것이 현실입니까? 실행될 때 asignment의 왼쪽에 ABC를 역 참조하고 파일에 저장하게 될 문자열을 "file"에 저장하는 쉘 스크립트를 생성하는 것으로 보입니다 =home_dir. 물론 유스 케이스가 무엇인지 모르겠다.
Johan

2
이로 인해 리터럴 $이 원격 쉘로 전송되지만 문자열이로 에코되기 전에 해당 쉘이 확장 $ABC됩니다 file. $파일에 리터럴을 쓰려면 echo "\\\$ABC=home_dir"원격 쉘이 수신 할 수 있도록 또 다른 (이스케이프 된) 백 슬래시 :가 필요합니다 echo "\$ABC=home_dir".
chepner

9

가장 저렴한 탈출 방법은

$ ssh hostname sudo -s << \EOF
echo "$ABC=home_dir" > file
EOF

4

문자열을 cat원격 쪽 프로세스에 보내서 인용 수준을 저장하십시오 .

echo 'echo $ABC=home_dir' | ssh hostname sudo -s "cat > file"

작은 따옴표 $는 로컬 끝을 보호하고 문자열은 다른 셸 명령에 대한 인수가 아닌 cat(via sudo)로 직접 읽으므로 다른 셸에서 문자열을 볼 수 없습니다 .

코드를 사용하면 다음을 보호하기 위해 추가 이스케이프 레이어가 필요합니다 $.

$ ssh hostname sudo -s <<EOF
echo "\\\$ABC=home_dir" > file
EOF

\$원격 쉘이 $파일에 리터럴 을 쓰도록 원격 호스트에 리터럴을 보내야 합니다. here-doc 마커를 인용하여이를 단순화 할 수도 있습니다.

$ ssh hostname sudo -s <<\EOF
echo "\$ABC=home_dir" > file
EOF
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.