เหตุใดจึงเริ่มต้นคำสั่งเชลล์ด้วยแบ็กสแลช


คำตอบ:


200
alias curl='curl --some --default --options'

หากคุณมีนามแฝงอยู่curlและคุณไม่ต้องการใช้งานการใส่แบ็กสแลชข้างหน้าจะเป็นการปิดใช้งานนามแฝงและรันไบนารี curl โดยตรง

โปรดทราบว่าสิ่งนี้ใช้ได้เฉพาะกับเชลล์แบบโต้ตอบเท่านั้น ชื่อแทนจะไม่มีผลในสคริปต์ดังนั้นจึงไม่จำเป็นต้องมี


4
นามแฝงสามารถใช้ในสคริปต์โดยใช้shopt -s expand_aliasesก่อนใช้นามแฝง
Alex

@lbaby Same ใน Kornshell คุณจัดการนามแฝงคำสั่งที่เป็นไปได้โดยใส่แบ็กสแลชไว้ข้างหน้า นี้เป็นเรื่องธรรมดามากในการ Kornshell เมื่อมีคนกำหนดคำสั่งแจ้งให้กับชื่อของไดเรกทอรีในพวกเขาที่ หมายเหตุบรรทัดแรกของฟังก์ชั่นนี้คือ `\ cd" $ @ "`
David W.

1
มันเป็นมูลค่า noting ว่า\curlไม่บายพาสเปลือกใด ๆฟังก์ชั่นcurlการตั้งชื่อ สำหรับสิ่งนั้นคุณสามารถใช้คำสั่งในตัวของ bash command:command curl ...
Keith Thompson

7
ง่ายต่อการทำความเข้าใจวิธีการเขียน\curl ...คือcommand curl ...
เกล็น Jackman

โปรดทราบว่าdash(และอาจเป็นหอยอื่น ๆ ถึงแม้ว่าคุณจะถูกต้องหากbashไม่มีexpand_aliases) จะขยายนามแฝงในสคริปต์
Adrian Günter

163

ข้อมูลจำเพาะเชลล์ (Bourne / POSIX) ระบุว่าการแทนที่สมนามในเชลล์แบบโต้ตอบถูกระงับเมื่ออักขระใด ๆ ของคำสั่งถูกอ้างถึง แบ็กสแลชเป็นวิธีหนึ่งในการทำเช่นนั้น แต่ก็มีวิธีอื่น ๆ ที่รู้จักกันดีในการอ้างถึง: ราคาเดียวและสองครั้ง ทั้งหมดต่อไปนี้จะระงับการทดแทนนามแฝง:

 \curl
 cur\l
 \c\u\r\l
 "c"url
 "curl"
 "c""u""r""l"
 'curl'
 'cu'"rl"

การใช้\curlเป็นวิธีที่พบได้บ่อยและอ่านง่ายที่สุด เนื่องจากนี่เป็นคุณสมบัติมาตรฐานคุณจึงสามารถคาดหวังได้ว่ามันจะทำงานได้ในทุกเชลล์ของ Bourne-Heritage

\curlดูเหมือนคำสั่ง TeX เล็กน้อยใช่ไหม? :-)


14
+1 สำหรับการให้เหตุผลที่เฉพาะเจาะจงว่าทำไมต้อง\curlข้ามนามแฝงที่มีชื่อเดียวกัน ทราบว่ามีเพียงนามแฝงจะข้ามวิธีนี้ไม่ได้เปลือกฟังก์ชั่น ; command curl ...จะช่วยให้มั่นใจได้ว่าจะผ่านได้เช่นกัน
mklement0

1
ฉันไม่เห็นจุดประโยคสุดท้าย อย่างไรก็ตามคุณเพียงกล่าวถึงการข้ามนามแฝงแต่การอ้างถึงประเภทใดก็ตามจะเป็นการเลี่ยงผ่านคำหลัก
gniourf_gniourf

@ mklement0 ไม่แน่ใจว่า… command() { echo "Not command, lol!"; } ; command -V echo ; \command -V echo ; \command command echo "This is command! (masking despair)"พิมพ์Not command, lol!x 3
Adrian Günter

3
@ AdrianGünter: ใช่ถ้าคุณแทนที่command ตัวเองด้วยฟังก์ชั่นเปลือกคุณจะเอาชนะกลไก สิ่งที่แสดงให้เห็นตัวอย่างของคุณคือการที่\ ไม่บายพาสฟังก์ชั่นตามที่ระบุไว้ ตัวอย่างการไม่เอาชนะตนเอง: date() { echo 'not date'; }; date; command date. หากคุณกำลังกังวลเกี่ยวกับอันตรายยุ่งเกี่ยวกับcommandดูstackoverflow.com/a/35931876/45375
mklement0

@ mklement0 ฉันเข้าใจทุกอย่าง แต่ประเด็นของฉันคือถ้าไม่สามารถรับประกันได้ว่าชื่อคำสั่งอื่นไม่มีอยู่ในฟังก์ชั่น (เช่นคุณขาดการควบคุมสภาพแวดล้อมในการดำเนินการของคุณ) จากนั้นหนึ่งก็ไม่สามารถพึ่งพาได้commandที่จะไม่ถูกแทนที่ จากลิงค์ของคุณเอง:Thus, with no control over the execution environment, you cannot write shell scripts that are fully immune to tampering, unless you know that your code will be executed by dash, ksh, or bash (with the workaround in place)
Adrian Günter
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.