ใช้ ^ เป็นตัวบ่งชี้เชลล์


19

ฉันเขียนสคริปต์เล็ก ๆ วันนี้ซึ่งมี

grep -q ^local0 /etc/syslog.conf

ในระหว่างการตรวจสอบผู้ร่วมงานแนะนำ^local0ให้เสนอราคาเพราะ^หมายถึง "ท่อ" ในเชลล์เป้าหมาย ฉันได้พยายามติดตามข้อมูลอ้างอิงที่กล่าวถึงสิ่งนี้ ไม่พบสิ่งใดบนอินเทอร์เน็ตที่แนะนำว่านี่เป็นปัญหา

อย่างไรก็ตามปรากฎว่าการใช้งานbsh(ซึ่งอ้างว่าเป็นเชลล์เป้าหมาย) บน AIX 7 มีลักษณะการทำงานนี้:

> bsh
$ ls ^ wc
      23      23     183
$ ls | wc
      23      23     183

ไม่มีการใช้งาน "บอร์นเชลล์" อื่นใดที่ฉันพยายามทำในลักษณะนี้ (นั่น^คือไม่ถือว่าเป็นเชลล์เมตาอักขระเลย) ฉันลองใช้shCentOS (ซึ่งทุบตีจริงๆ) และshFreeBSD (ซึ่งไม่ใช่ทุบตี) ฉันไม่มีระบบอื่น ๆ ให้ลอง

พฤติกรรมนี้คาดหวังหรือไม่? เชลล์ตัวไหนที่คิดว่า^เป็นตัวชี้ตำแหน่งท่อ?


1
ฉันรู้ว่า^มันเป็นตัวละครปฏิเสธใน zsh และในพื้นที่ regex ในฐานะที่เป็นความคิดเห็นที่แยกต่างหากโดยทั่วไปแล้วควรใช้เครื่องหมายคำพูดเดี่ยวในนิพจน์ grep เพื่อความสะดวกในการพกพาข้ามเชลล์
mkc

บอร์นเชลล์มีจำนวนมากของพฤติกรรมแปลก ๆ ที่เรายังคงเห็น arounds [ x"$foo" = x"bar" ]ทำงานในปัจจุบันรหัสเปลือกเช่น
jordanm

bshไม่ใช่ Bourne Shell ชื่อนี้ถูกใช้สำหรับ Bourne Shell บน AIX เท่านั้น bshค่อนข้างเป็นเปลือกที่ฉันแนะนำในปี 1984 ที่ H.Berhold AG บน UNOS (UNIX clone แรก) โปรดทราบว่า AIX ไม่มีอยู่จริงในปี 1984
schily

คำตอบ:


21

^ตัวอักษรเป็นคำพ้องของ|วันที่กลับจากเปลือก ธ อมป์สัน พวกเขาได้รับการแนะนำให้รู้จักในเวลาเดียวกันใน Unix v4 และมีการกล่าวถึงกันในหน้าคน สเวน Mascheckกล่าวว่า^เป็น“อาจ [แนะนำ] สำหรับเหตุผลของความสะดวกสบายบนขั้วต้นบนกรณีเท่านั้น” ซึ่งพิมพ์|เป็น“ค่อนข้างของความเจ็บปวด”

Thompson shell นั้นหายไปนาน แต่ตัวตายตัวแทนของBourne shell นั้นยังคงอยู่ในรูปแบบที่เหมือนกัน (แม้ว่าหน้า man จะกล่าวถึงเท่านั้น|)

ตัวตายตัวแทนของเชลล์เช่น ash, bash และ ksh จะเข้าใจ|ว่าเป็นตัวอักษรไพพ์เท่านั้น คุณจะไม่พบเชลล์เป้าหมายจริงในตัวแปรยูนิกซ์โอเพ่นซอร์สมาเป็นเวลานานเนื่องจากไม่มีบอร์นเชลล์รุ่นเปิดแหล่งที่มา (ฉันคิดว่า OpenSolaris รวมอยู่ด้วย แต่ก็ไม่ได้นำมาใช้ในที่อื่นเพราะในเวลานั้นล้าสมัยไปแล้วเนื่องจากการใช้งานที่ใหม่กว่า)

ข้อกำหนด Unix เดี่ยวไม่ได้พูดถึง^เป็นตัวละครพิเศษอย่างมีประสิทธิภาพซึ่งหมายความว่าเปลือกหอย POSIX ควรตีความมันliterally¹ ฉันไม่คิดว่าจะมีตัวแปร Bourne shell ที่เป็นไปตาม POSIX ทั้งหมด (มีการใช้งานที่เป็นอิสระเท่านั้น)

^เป็นพิเศษใน zsh เมื่อextendedglobเปิดใช้งานตัวเลือกแต่ไม่ได้อยู่ในโหมดความเข้ากันได้ของ sh ในโหมดเริ่มต้นมันจะเบี่ยงเบนจาก POSIX ในหลาย ๆ ด้าน

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

¹ ยกเว้นว่าเป็นอักขระตัวแรกของนิพจน์วงเล็บเหลี่ยมในรูปแบบไวด์การ์ดโดยที่!อักขระการปฏิเสธมาตรฐาน แต่การประยุกต์ใช้อาจตีความ^ในลักษณะเดียวกัน


ขอขอบคุณกระทู้ทั้งหมดของ TUHS จากปี 2003 ได้รับความกระจ่าง
Greg Hewgill

เพื่อความสมบูรณ์คุณอาจต้องการพูดถึงว่า^มีความพิเศษในfishการเป็นผู้ดำเนินการเปลี่ยนเส้นทางrc/ esที่เป็นผู้ดำเนินการเชื่อมต่อหรือ csh / tcsh / bash / zsh สำหรับการขยายประวัติเมื่อเป็นอักขระแรกของบรรทัดคำสั่ง
Stéphane Chazelas


3

ใช่ OpenSolaris มีแหล่งที่มาของ Bourne Shell แต่แหล่งที่มานั้นไม่สามารถพกพาได้

รุ่นรักษาและพกพาสูงของแหล่งบอร์นเชลล์สามารถพบได้ที่นี่ในschily-*.tar.bz2จดหมายเหตุ

นี่คือส่วนที่เกี่ยวข้องของแหล่งที่มาในcmd.c:

/* 
* ^ is a relic from the days of UPPER CASE ONLY tty model 33s 
*/ 
if ((t = item(TRUE)) != 0 && (wdval == '^' || wdval == '|')) 

คุณจะเห็นว่าสิ่งนี้ไม่เกี่ยวข้องกับเชลล์เฉพาะ (เช่นเชลล์ ธ อมป์สัน) แต่จากความจริงที่ว่าในปี 1970 ยังมีตัวพิมพ์ใหญ่เพียงเทอร์มินัลรอบ ๆ

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