เกิดอะไรขึ้นกับทุบตี backticks?


1

ฉันมักจะนึกถึง backticks ใน bash ว่า "execute output ของ'some_command'" เกิดอะไรขึ้นในต่อไปนี้ ... พิจารณาสคริปต์myscript.plที่พิมพ์ข้อความต่อไปนี้:

   ส่งออก PS1 = "[STRING] $ PS1"

หากฉันคัดลอกเอาต์พุตจากcat file.txtไปยังบรรทัดรับคำสั่งและดำเนินการ "[STRING]" จะถูกเพิ่มไว้ด้านหน้าของพรอมต์ของฉัน

บนมืออื่น ๆ , backtick ไอเอ็นจีทำให้พรอมต์ของฉัน'myscript.pl' "[STRING]เกิดอะไรขึ้น?


ขออภัยเกี่ยวกับการจัดรูปแบบ - ฉันไม่สามารถรับ backticks เพื่อแสดงในบล็อคโค้ด
Andrew Wood

คำตอบ:


4

bashไม่เรียกใช้งานเอาต์พุตของคำสั่ง backtick เพียงแทนที่มันเท่านั้น (คุณลักษณะนี้เรียกว่าการทดแทนคำสั่งหลังจากทั้งหมด)

หากการทดแทนไม่ได้เป็นการอ้างอิงสองครั้งการแยกคำจะทำกับเอาต์พุตของคำสั่ง แต่เครื่องหมายคำพูดและอักขระพิเศษอื่น ๆ จะถูกละเว้น export PS1="[STRING] $PS1"แบ่งออก$IFSเป็น:

  • export
  • PS1="[STRING
  • $PS1"

หากคุณต้องการที่จะดำเนินการเนื้อหาของไฟล์แหล่งมัน:

. ./file.txt

หรือไม่ใช่ POSIX:

source ./file.txt

หากคุณต้องการให้ทุกแยกมาตรฐานเพื่อนำไปใช้ทดแทน - ตัวอย่างเช่นตัวแปร - คุณสามารถใช้eval "$commands"หรือeval "$(foo)"eval "`foo`"หรือ แต่ระวังด้วยนะ


ให้ฉันอธิบายคำถามของฉัน ฉันไม่ได้เก็บคำสั่งไว้ในไฟล์ข้อความ แต่คิดว่ามันจะเป็นวิธีที่ดีในการเรียนรู้เกี่ยวกับปัญหาของฉัน ฉันได้ตั้งค่าสคริปต์ Perl เพื่อตั้งค่าตัวแปรสภาพแวดล้อม เพื่อหลีกเลี่ยงการสูญเสียสภาพแวดล้อมปัจจุบัน (ไม่ใช่คำที่ถูกต้อง - นามแฝง, ฟังก์ชั่น, ตัวแปรเชลล์, ฯลฯ ) ฉันมีสคริปต์ดัมพ์เปลี่ยนแปลงสภาพแวดล้อมที่ผู้ใช้หวังว่าจะสามารถนำไปใช้โดยใช้ backticks เพื่อเรียกใช้ ต้นฉบับ
Andrew Wood

อย่างไรก็ตามฉันเห็นการใส่ eval หน้านิพจน์ backticked ของฉันทำงานตามที่ฉันต้องการ
Andrew Wood

@ajwood: ฉันขอชี้ให้เห็นวรรคสุดท้ายของคำตอบของฉัน ( อย่าลืมเครื่องหมายอัญประกาศมิเช่นนั้นสิ่งของจะแตก)
grawity
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.