ใน zsh ให้${$(pwd)}
ส่งออกไดเรกทอรีปัจจุบัน อย่างไรก็ตามถ้าฉันวิ่งecho ${/path/to/somewhere}
มันแค่แสดงบรรทัดว่างเปล่า ทำไมสิ่งนี้ถึงเกิดขึ้น ขอบคุณ!
ใน zsh ให้${$(pwd)}
ส่งออกไดเรกทอรีปัจจุบัน อย่างไรก็ตามถ้าฉันวิ่งecho ${/path/to/somewhere}
มันแค่แสดงบรรทัดว่างเปล่า ทำไมสิ่งนี้ถึงเกิดขึ้น ขอบคุณ!
คำตอบ:
ฉันคิดว่าคุณพูดprint ${$(pwd)}
หรืออะไรแบบนั้นใช่มั้ย!
การขยาย ${$(pwd)}
ไปยังไดเรกทอรีการทำงานปัจจุบันเป็นลักษณะการทำงานที่คาดไว้แม้ว่ามันจะดูแปลก ๆ ในแวบแรก อย่าปล่อยให้คุณโง่โดยคิดว่าการทดแทนคำสั่ง$(pwd)
จะถูกประเมินก่อนผลลัพธ์จะถูกใช้เป็นชื่อตัวแปร ... ไม่มันถูกใช้เป็นค่าตัวแปร ตามที่man zshexpn
อธิบายไว้:
${name}
ค่าถ้ามีของชื่อพารามิเตอร์จะถูกแทนที่( ... ) ถ้า
${...}
การแสดงออกประเภทพารามิเตอร์หรือ$(...)
เปลี่ยนตัวประเภทคำสั่งที่ใช้ในสถานที่ของข้างต้นก็จะขยายตัวเป็นครั้งแรกและผลที่ได้จะใช้เป็นว่ามันเป็นค่าของname
name
(... ) แบบฟอร์มที่$(...)
มักมีประโยชน์เมื่อใช้ร่วมกับค่าสถานะที่อธิบายไว้ถัดไป ดูตัวอย่างด้านล่าง(... ) การตั้งค่าสถานะ f มีประโยชน์ในการแบ่งบรรทัดการแทนที่แบบสองบรรทัดต่อบรรทัด ตัวอย่างเช่น
${(f)"$(<file)"}
แทนที่เนื้อหาของไฟล์ที่ถูกแบ่งเพื่อให้แต่ละบรรทัดเป็นองค์ประกอบของอาร์เรย์ผลลัพธ์
ตัวอย่างที่สองของคุณ ฉันคิดว่านี่เป็นรูปแบบแทนที่ไวยากรณ์:
${name/pattern/repl}
แทนที่การจับคู่รูปแบบที่ยาวที่สุดที่เป็นไปได้ในการขยายชื่อพารามิเตอร์โดยการแทนที่สตริง ( ... )
ดูตัวอย่างนี้ก่อน:
$ foo=hello
$ print ${foo/hello/good/bye}
good/bye
หากคุณไม่foo
ระบุzsh
ให้ทำการค้นหาและแทนที่ในตัวแปร${}
ซึ่งว่างเปล่า:
$ print ${}
$
- ดังนั้น${/something/foo/bar}
จะส่งคืนสตริงว่างด้วย