วิธีพิมพ์“ $” ในเอกสารที่นี่


43

ฉันจะสะท้อน "$" ใน here-doc ใน bash ได้อย่างไร?

$ABC=home_dirตัวอย่างเช่นผมต้องการที่จะมีไฟล์ที่มีเนื้อหาบนเซิร์ฟเวอร์ระยะไกลเช่น

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

แต่มันก็จะถือว่าเป็นตัวแปร ฉันจะพิมพ์ตัวอักษรได้$อย่างไร


2
คุณสามารถใช้เครื่องหมายคำพูดเดี่ยว
Rahul Patil

2
นั่นเป็นเรื่องที่เกิดขึ้นโดยอ้อม แน่ใจหรือไม่ว่าคุณไม่สามารถสร้างไฟล์บนโลคัลโฮสต์scpได้
l0b0

คำตอบ:


65

หากคุณต้องการเขียน here-doc และคุณไม่ต้องการให้เอกสารใด ๆ ขยายออกไปหรือตีความอักขระพิเศษใด ๆ คุณสามารถอ้างอิงป้ายกำกับด้วยเครื่องหมายคำพูดเดียวเช่นนี้:

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

อย่างไรก็ตามสถานการณ์ของคุณตามที่อธิบายไว้ในตัวอย่างของคุณมีความซับซ้อนมากขึ้นเพราะคุณกำลังส่งเนื้อหานี้ผ่าน ssh ไปยังระบบรีโมตเพื่อให้ทำงานโดย sudo ซึ่งเรียกใช้เชลล์ด้วย (และเพื่อให้เชลล์จะขยายเนื้อหา เช่นกัน) คุณจะต้องมีการยกระดับข้อความเพื่อให้ถูกต้อง แต่ถึงกระนั้นมันก็ยังใช้งานไม่ได้เพราะ sudo ต้องการเทอร์มินัล (เพื่อให้สามารถขอรหัสผ่านได้) และคุณได้เปลี่ยนเส้นทางจาก stdin แม้แต่การใช้ssh -tก็ไม่ได้ช่วยอะไร

นอกจากนี้ฉันเห็นด้วยกับโจฮาน ไม่ชัดเจนนี่เป็นสิ่งที่คุณต้องการจริงๆ โปรดทราบว่ามันไม่ถูกต้องตามกฎหมายในการกำหนดค่าให้กับการอ้างอิงตัวแปรของเชลล์ดังนั้นหากไฟล์ที่คุณพยายามสร้างนั้นควรจะเป็นเชลล์สคริปต์มันจะไม่ทำงานตามที่คุณอธิบายไว้ บางทีถ้าคุณสำรองบิตและอธิบายสิ่งที่คุณจริงๆต้องการที่จะทำเราสามารถช่วยให้มากขึ้น


นี่คือคำตอบที่ดีที่สุดเพราะสามารถรองรับเอกสารที่นี่นานมาก มันเป็นหลักฐานที่งี่เง่า
Felipe Alvarez

23

หลบหนี $

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

ผมไม่ทราบว่าสิ่งที่กรณีการใช้งานของคุณ แต่โดยปกติคุณต้องการแทนhome_dir=$ABC$ABC=home_dir


2
วิธีนี้ใช้ได้ผล แต่จริง ๆ แล้วสิ่งที่ OP ต้องการหรือไม่ ดูเหมือนว่าจะสร้างเชลล์สคริปต์ซึ่งเมื่อดำเนินการจะจัดเก็บใน "ไฟล์" สตริงซึ่งจะอ้างอิง ABC สำหรับด้านซ้ายของการจัดตำแหน่งและน่าจะจบลงด้วยการจัดเก็บ=home_dirไฟล์? แน่นอนผมไม่ทราบว่ากรณีที่ใช้คือ ...
โจฮาน

2
นี้จะทำให้ตัวอักษร$ที่จะถูกส่งไปยังเปลือกระยะไกล แต่แล้วว่าเปลือกจะขยายตัวก่อนที่จะสะท้อนสตริง$ABC fileการเขียนอักษร$ไปยังแฟ้มคุณจะต้องอื่น (หนี) ทับขวา: เพื่อให้เปลือกระยะไกลได้รับecho "\\\$ABC=home_dir" echo "\$ABC=home_dir"
chepner


4

คุณสามารถบันทึกข้อความในระดับหนึ่งได้ด้วยการส่งสตริงไปยังcatกระบวนการบนรีโมทปลายทาง:

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

เครื่องหมายอัญประกาศเดี่ยวป้องกัน$บนโลคัลสิ้นสุดและสตริงไม่ถูกเห็นโดยเชลล์บนอีกอันเนื่องจากถูกอ่านโดยตรงโดยcat(ผ่าน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.