นามแฝงใหม่ไม่สามารถใช้ได้หลังจาก


9

ถึงตอนนี้ฉันคิดว่าเซมิโคลอนในเชลล์มีความหมายเดียวกับตัวแบ่งบรรทัด (อย่างใด) ดังนั้นฉันจึงแปลกใจที่สำหรับ

alias <name>=<replacement text>; <name>

<name>ไม่เป็นที่รู้จักในขณะที่มันเป็นที่รู้จักในบรรทัดถัดไป csh, tcsh, sh, kshและbashประพฤติเดียวกัน อย่างน้อยcshก็ไม่สำคัญว่าจะใช้นามแฝงโดยตรงหรือหากสคริปต์มีที่มาก่อนเซมิโคลอน - นามแฝงจะไม่รู้จัก;แต่จะรู้จักในบรรทัดคำสั่งถัดไป นี่เป็นข้อบกพร่องหรือพฤติกรรมนี้ตั้งใจหรือไม่


"ฉันคิดว่าเซมิโคลอนในเชลล์มีความหมายเดียวกับตัวแบ่งบรรทัด"เกือบ" ไม่มาก!
Lightness Races ในวงโคจร

1
การตีความเซมิโคลอนและบรรทัดใหม่ขึ้นอยู่กับวิธีการแยกวิเคราะห์ สำหรับคำสั่ง "dot" Bourne Shell จะเรียก parser ด้วย "NLFLG" ที่บอกให้รักษาบรรทัดใหม่และอัฒภาคให้เท่ากันในบางสถานการณ์ แต่นี่ไม่ใช่กรณีอื่น โดยทั่วไปแล้วเครื่องหมายอัฒภาคและการแบ่งบรรทัดจะไม่เท่ากันเนื่องจากคุณสามารถมีการแยกบรรทัดได้โดยที่เครื่องหมายอัฒภาคอาจทำให้เกิดข้อผิดพลาดทางไวยากรณ์
schily

คำตอบ:


9

ไวยากรณ์นามแฝงที่คุณใช้นั้นไม่เหมาะสมสำหรับเชลล์ POSIX สำหรับเชลล์ POSIX คุณต้องใช้:

alias name='replacement'

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

ก่อนที่จะดำเนินการตั้งค่านามแฝงของคุณตัวแยกวิเคราะห์ทั้งหมดจะถูกอ่านและด้วยเหตุนี้บรรทัดคำสั่งของคุณจะไม่ทำงาน

หากนามแฝงปรากฏบนบรรทัดคำสั่งถัดไปมันจะทำงาน


นอกจากนี้เปลือกหอยบางชอบyashหรือจะไม่ขยายนามแฝงในzsh shell -c 'alias name=replacement<newline>replacement'สำหรับ AT&T kshคุณมีปัญหากับสคริปต์ที่มา
Stéphane Chazelas

ฉันจำเป็นต้องใช้ csh ในกรณีนี้ - ไม่มีการ=ใช้ในaliasไวยากรณ์
user3224237

@ user3224237 - =นี้มีอะไรจะทำอย่างไรกับ เป็นเพราะการขยายนามแฝงเกิดขึ้นเมื่อเชลล์แรกเห็นบรรทัดซึ่งเป็นก่อนที่คุณจะกำหนดนามแฝง
cas

@ Stéphane Chazelas พฤติกรรมที่มีสคริปต์ "ที่มา" นั้นเกิดจากข้อเท็จจริงที่ว่าเชลล์ Bourne แยกวิเคราะห์ไฟล์ดังกล่าวอย่างสมบูรณ์ก่อนที่จะดำเนินการ Ksh ขึ้นอยู่กับแหล่งที่มาของเชลล์เป้าหมายและทุกอย่างที่ไม่ได้เปลี่ยนจะทำงานในลักษณะเดียวกัน
schily

@ schily ใช่มันเป็นเหตุผลเดียวกันกับzsh/yash -c 'code'ที่codeมีการแยกวิเคราะห์โดยรวม ดูเหมือนจะไม่เป็นกรณีสำหรับเชลล์เป้าหมาย ดังนั้นฉันคิดว่าเชลล์เป้าหมายแยกวิเคราะห์ว่าcodeมีครั้งละหนึ่งบรรทัด
Stéphane Chazelas

5

ลักษณะการทำงานนี้มีจุดมุ่งหมายและระบุโดย POSIX ภายใต้นามแฝงชดเชย

นามแฝงถูกแทนที่ทันทีหลังจากเชลล์ทำการรับรู้โทเค็นและก่อนที่จะใช้กฎไวยากรณ์ใด ๆ ในเวลาที่คุณเรียกว่านามแฝง<name>คำสั่งaliasจะไม่ถูกดำเนินการ

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