วัตถุประสงค์ของ cd `(backtick) คืออะไร?


57

พฤติกรรมต่อไปนี้จะเหมือนกันใน Fedora และ CentOS

cd mydirectory

โรงงาน

cd notadirectory

ทำงาน (ได้รับข้อผิดพลาดจาก Bash)

อย่างไรก็ตาม

cd `

ให้ฉันเรียงลำดับของบางอย่าง:

>

ไม่มีสิ่งใดที่ฉันคิดว่าจะป้อนให้การตอบสนองใด ๆ มันแค่มุ่งหน้าไปยังบรรทัดถัดไปเพื่อแจ้งอีกครั้ง ฉันเพียงแค่ใช้CTRL+ เพื่อออกจากการกลับไปของฉันCroot@localhost

อะไรคือจุดประสงค์ของสิ่งนี้และจะทำอะไรได้บ้าง?

ขอบคุณ!



6
ดังนั้นคำถามของคุณเป็น>มากกว่าเกี่ยวกับ backtick เนื่องจากสามารถเกิดขึ้นได้ในสถานการณ์อื่น ๆ
Tobias Kienzler

คำตอบ:


124

สิ่งที่คุณพิมพ์คือbacktick - เป็นจุดเริ่มต้นของคำสั่งในการทุบตีเพื่อประเมินสิ่งที่คุณพิมพ์เป็นคำสั่ง >จะปรากฏขึ้นเพื่อแสดงว่าคุณยังคงมีการป้อนคำสั่งในบรรทัดถัดไป

หากคุณปิด backtick คุณจะพบว่าคำสั่งทั้งหมดจะทำงาน เช่น

~$ cd `
> echo /var`
/var$

17
คุณสามารถทำรังได้ สำหรับตัวอย่างที่ค่อนข้างเหมือนจริง: cd `dirname \`which ls\``= cd ไปยังไดเรกทอรีที่มี "ls" ตั้งอยู่ (เช่นcd /binเนื่องจากมัน/bin/ls) [แก้ไข: ว้าว, การหลบหนีที่ markdown คือ HARD]
MSalters

54
@MSalters คุณอาจจะสะดุดเข้ากับเหตุผลที่ว่าทำไมทุบตีทันสมัยชอบที่จะ$() ``ตัวอย่างของคุณ (รวมถึงข้อความที่ถูกต้อง) จะกลายเป็นcd "$(dirname "$(which ls)")"สิ่งที่เสียสติน้อยกว่ามาก
Muzer

31
@ Muzer มันไม่ได้เป็นเพียงแค่การทุบตีที่ชอบ แต่มันแนะนำใน POSIX สเปคที่จะใช้$()มากกว่า backquotes
ปลาดาว

59

คำตอบของ JohnCอธิบายถึง backtick แล้ว แต่สิ่งที่คุณสงสัยเกี่ยวกับก็คือ>พรอมต์ นี้พรอมต์ต่อเนื่องและจะไม่เรียกโดยเฉพาะ backtick แต่เสมอเมื่อเปลือกของคุณรู้ได้อย่างชัดเจนคุณไม่ได้กระทำการป้อนคำสั่ง ตัวอย่างที่ง่ายที่สุดคือการวางความต่อเนื่องของบรรทัดที่ชัดเจน\ที่ท้ายบรรทัดอินพุต (ซึ่งช่วยแยกอินพุตยาว):

$ echo \
> hallo

โปรดทราบว่าเช่นเดียวกับPS1การควบคุมรูปลักษณ์ของพรอมต์คำสั่งคุณสามารถตั้งค่าPS2ให้เปลี่ยนพรอมต์การดำเนินการต่อเช่น

$ export PS2="(cont.) "
$ echo \
(cont.) hallo

มีสาเหตุหลายประการที่ทำให้ความต่อเนื่องเกิดขึ้น backtick เดียวไม่สมบูรณ์ แต่คุณสามารถป้อนบางอย่างเช่น

ls -l `which cp`

ในบรรทัดเดียว (หมายเหตุด้านข้าง: แนะนำให้ใช้$(และ)แทนเนื่องจากวงเล็บทำให้เห็นได้อย่างชัดเจนว่าการขยายตัวเริ่มต้นและสิ้นสุดในขณะที่ backticks เดียวทำให้ยากต่อการดูว่าใครหายไปและทำรัง ... ) สาเหตุที่เป็นไปได้อื่น ๆ สำหรับการแจ้งเตือนความต่อเนื่อง:

  • หายไปdoneหลังจากwhileหรือfor
  • หายไปfiหลังจากif
  • หายไปesacหลังจากcase
  • วงเล็บปิดที่ขาดหายไปเช่นใน subshells (cd $HOME; cat .bashrc)
  • คำสั่งที่หายไปหลังจากการไพพ์|เช่นเดียวกับการดำเนินการตามเงื่อนไข||และ&&(ไม่ใช่&เพราะนั่นเป็นเพียงการทำให้คำสั่งทำงานในพื้นหลัง)
  • อ้างปิดที่ขาดหายไป ( 'หรือ")

พอทราบอย่างชัดเจนวงเล็บปีกกาที่ขาดหายไป}หลังจากการขยายตัวแปร${ยังทำให้เกิดพรอมต์ต่อเนื่อง แต่จะล้มเหลวเนื่องจากพื้นที่ที่แทรกไว้:

$ echo ${
> PS2}
bash: ${
PS2}: bad substitution

2
และสิ่งเดียวกันที่เกิดขึ้นเมื่อมีการใช้คำพูด :)
สตีSchütt

1
ฉันรู้คำตอบของคำถามนี้อยู่แล้วเมื่อฉันเห็นในแถบด้านข้าง แต่ฉันต้องการให้คุณเพิ่มพิเศษถึงแม้ว่า +1 จินตภาพสำหรับคำตอบในเชิงลึกที่ดีมาก นี่คือการเรียงลำดับของเนื้อหาที่ทำให้เว็บไซต์ StackExchange ยอดเยี่ยม ดังนั้น ... ขอบคุณและยังคงยอดเยี่ยม
Unkwntech

4

หมายความว่าคำสั่งของคุณยังไม่สมบูรณ์ ในความเป็นจริงตัวอักษร backtick `ใช้เพื่อคั่นคำสั่ง inline

ตัวอย่าง:

cd /tmp # Go to /tmp
pwd # Prints the current working  directory
ls `pwd` # Lists the content of the current working directory

0

การทดแทนคำสั่ง backtick เริ่มต้น / สิ้นสุด เชลล์อ่านคำสั่งภายใน backticks ตีความผลลัพธ์และวางผลลัพธ์เหล่านั้นลงในคำสั่ง เช่น:. ls which cpส่งผลให้เกิดการ "เรียกใช้ cp" และผลลัพธ์ของคำสั่งนั้นคือ / bin / cp จะถูกใช้เป็นอาร์กิวเมนต์ของคำสั่ง ls อย่างไรก็ตามพฤติกรรมนี้เลิกใช้แล้วเพื่อสนับสนุนการแทนคำสั่ง $ (cmd) ที่ชัดเจนและอ่านง่ายขึ้น

เมื่อพิมพ์ cd `เชลล์คาดหวังว่าคำสั่งจะต้องถูกดำเนินการเพื่อติดตามและจะปิดด้วย backtick

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

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