ผ่านและการตั้งค่าตัวแปรใน heredoc


18

ฉันมีสคริปต์ที่ต้องทำสิ่งต่าง ๆ มากมายในเครื่องระยะไกลที่แตกต่างกัน ฉันคิดว่า heredoc จะใช้งานได้ แต่ฉันไม่สามารถใช้ตัวแปรที่กำหนดไว้ที่อื่นในสคริปต์และอีกหนึ่งที่กำหนดไว้ใน heredoc

นี่คือรหัสบางส่วน:

#!/bin/sh

FOO="foo"
ssh some.remote.host << EOF
  BAR="bar"
  echo "FOO=$FOO"
  echo "BAR=$BAR"
EOF

นี่พิมพ์เฉพาะสิ่งต่อไปนี้:

FOO =

BAR บาร์ =

อย่างไรก็ตามถ้าฉันอ้างถึงบรรทัด EOF เช่นนี้ ssh some.remote.host << "EOF" แล้วมันพิมพ์เฉพาะสิ่งต่อไปนี้:

FOO = foo

BAR =

มีคำแนะนำเกี่ยวกับวิธีที่ฉันสามารถใช้ตัวแปรทั้งสองภายใน heredoc?

ขอบคุณ

คำตอบ:


27

ในระยะสั้นใช้:

  • คำหลักที่ไม่ได้ยกมา heredoc เช่น EOF
  • ถ่านดอลลาร์ปกติสำหรับตัวแปรด้านนอก (เช่นในท้องถิ่น ) เช่น$FOO
  • ตัวละครดอลลาร์หนีเหรียญสำหรับตัวแปรภายใน (เช่นระยะไกล ) เช่น\$BAR

หากคุณปล่อยคำสำคัญ heredoc (เช่นEOF) unquote ดังนั้นเนื้อหาของ heredoc จะถูกประมวลผลแบบโลคัลดังนั้นจึง$FOOถูกขยายfooและBARขยายเป็นสตริงว่าง จากนั้นsshคำสั่งของคุณจะกลายเป็น:

BAR="bar"
echo "FOO=foo"
echo "BAR="

หากคุณอ้างอิงคำสำคัญ heredoc การขยายตัวแปรจะถูกระงับดังนั้นsshคำสั่งของคุณจะกลายเป็นสิ่งนี้แทน:

BAR="bar"
echo "FOO=$FOO"
echo "BAR=$BAR"

เนื่องจากFOOอาจจะไม่ได้กำหนดไว้ในสภาพแวดล้อมเปลือกระยะไกล, การแสดงออก"FOO=$FOO"ได้รับการประเมินเป็น"FOO=''"เช่นFOOถูกตั้งค่าเป็นสตริงที่ว่างเปล่า

หากคุณต้องการใช้ทั้งสองตัวแปรคุณจะต้องปล่อยให้คำหลัก heredoc ไม่ได้มีการประกาศไว้ดังนั้นการขยายตัวของตัวแปรจะเกิดขึ้นสำหรับตัวแปรที่กำหนดไว้ในเครื่องแล้วหนี (ด้วยเครื่องหมายแบ็กสแลช) ตัวแปรที่คุณต้องการขยายจากระยะไกลเช่น :

#!/bin/sh

FOO="foo"
ssh some.remote.host << EOF
  BAR="bar"
  echo "FOO=$FOO"
  echo "BAR=\$BAR"
EOF

ในกรณีนี้คำสั่ง ssh ของคุณ (ตามที่ได้รับจากเซิร์ฟเวอร์ระยะไกล) จะเป็นดังนี้:

  BAR="bar"
  echo "FOO=foo"
  echo "BAR=$BAR"

1
มันยอดเยี่ยมมาก! ฉันใช้เวลาหลายปีในการพยายามหาสิ่งนี้ ขอบคุณมากสำหรับวิธีนี้
trubliphone
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.