ฉันควรใช้เครื่องหมายสแลชที่ส่วนท้ายของตัวแปรพา ธ ในเชลล์สคริปต์หรือไม่? [ปิด]


11

วันนี้เมื่อเขียนเชลล์สคริปต์ของฉัน

ทันใดนั้นคำถามก็มาถึงใจฉัน

ตั้งแต่cd /target_dirและcd /target_dir/ทั้งสองทำงาน
ฉันควรเพิ่มเครื่องหมายสแลชที่ส่วนท้ายของตัวแปรพา ธ ของฉันในเชลล์สคริปต์หรือไม่
เช่นเมื่อเทียบกับLOG_PATH=/data/nginx/logsLOG_PATH=/data/nginx/logs/

ฉันทำการค้นหาขั้นต้นบน google แต่ไม่พบการสนทนาเกี่ยวกับสิ่งนี้บางทีมันอาจจะธรรมดาเกินไป

สำหรับตอนนี้มันยากสำหรับฉันที่จะตัดสินใจเลือกสไตล์
แต่ฉันชอบLOG_PATH=/target_dir/สไตล์มากกว่านี้
เพราะเมื่อฉันกำลังเติมข้อความอัตโนมัติด้วยการทุบตีมันทำให้ฉันเห็นผลลัพธ์ด้วยเครื่องหมายทับ

คุณมีความคิดเห็นเกี่ยวกับเรื่องนี้ทำไม



ไม่มีกฎ สไตล์การเข้ารหัสทั้งสองมีข้อดีและข้อเสียเปรียบบางประการ
andcoz

คำตอบ:


9

ตาม POSIX:

คำจำกัดความของชื่อพา ธ :

สตริงที่ใช้เพื่อระบุไฟล์ มีอักขระเริ่มต้น<slash> ที่เป็นทางเลือกตามด้วยศูนย์ชื่อหรือมากกว่านั้นคั่นด้วยอักขระ<slash> ชื่อพา ธ อาจมีอักขระ<slash>ต่อท้ายอย่างน้อยหนึ่งตัว อักขระ<slash> ที่ต่อเนื่องหลายตัวถูกพิจารณาว่าเหมือนกับ<slash>หนึ่งตัวยกเว้นในกรณีที่มีอักขระ<slash> นำหน้าสองตัว


@ มันน่าสนใจที่ฉันสามารถ cd //และ/ด้วยชื่อของพวกเขาแสดงแตกต่างกันใน bash prompt และการใช้pwdฉันจะได้รับเส้นทางที่แตกต่างกัน แต่เนื้อหาของพวกเขาเหมือนกัน! ทำไม?
Zen


1
เพราะbashติดตามไดเรกทอรีปัจจุบันอย่างไร้เดียงสาเหมือนสตริง มันแค่ผนวกและลบออกจากเส้นทางแบบ heuristically มันไม่ได้เชื่อมโยงกับระบบไฟล์จริง สิ่งหนึ่งที่สำคัญคือคุณสามารถ cd เป็นลิงค์สัญลักษณ์และกลับมาในลักษณะเดียวกัน (ถ้า bash ไม่ได้ตัดสินใจว่ามันมากเกินไปและเริ่มต้นใหม่) อีกสิ่งหนึ่งคือสิ่งที่คุณอธิบาย คุณไม่ควรพึ่งพาเชลล์ในการติดตามไดเรกทอรีปัจจุบันมันไม่น่าเชื่อถือ
orion


6

หากต้องการอยู่ด้านปลอดภัยให้ใส่เครื่องหมายทับ สิ่งนี้อาจนำไปสู่การทับหลายครั้งเมื่อต่อพา ธ แต่อย่างน้อยคุณก็หลีกเลี่ยงปัญหา

ตัวอย่างสองสามตัวอย่าง: rsyncถือว่าพา ธ แตกต่างกันหากมีเครื่องหมายสแลชต่อท้าย (จะซิงโครไนซ์ไดเรกทอรีนั้นแทนที่จะสร้างไดเรกทอรีย่อยอื่น) ลิงก์สัญลักษณ์ไปยังไดเรกทอรีบางครั้งทำงานในลักษณะที่ไม่คาดคิดเมื่อไม่มีเครื่องหมายทับท้าย - อย่างน้อยการเติมกระสุนจะทำให้สับสน คุณไม่มีทางรู้ว่าคำสั่ง / สคริปต์ที่คุณเรียกใช้นั้นขึ้นอยู่กับการตรวจสอบเครื่องหมายทับสำหรับพฤติกรรมพิเศษบางอย่าง มันสามารถช่วยให้คุณประหยัดจากการเขียนทับบางสิ่งบางอย่าง ตัวอย่างเช่นหากคุณมีชื่อไฟล์fooแต่คุณคิดผิดว่าเป็นไดเรกทอรีและต้องการย้ายบางอย่างในนั้นmv bar fooจะเขียนทับไฟล์ (การสูญหายของข้อมูลภัยพิบัติที่อาจเกิดขึ้น) แต่mv bar foo/จะบ่นและไม่ทำอะไรเลย

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


2

ไม่คุณไม่ควร มันเพิ่มเครื่องหมายทับที่ไม่จำเป็นเพิ่มเติม ( /)

ตัวอย่าง

บอกว่าคุณต้องการส่งออกbinไดเรกทอรีของจาวาไปยังPATHตัวแปรของคุณ

export PATH=$PATH:/opt/jre1.7.0_45/bin/

ตรวจสอบตอนนี้

user@host:~$ which java
/opt/jre1.7.0_45/bin//java

สังเกตเห็นเครื่องหมายทับ ( /) ก่อนหน้าจาวา แต่โชคดีที่มันใช้งานได้ในกรณีเช่นนี้


ฉันเห็นในลิงค์นี้มีคำตอบ 31 โหวตซึ่งผู้เขียนคิดว่าเราควรเพิ่มเครื่องหมายทับ ฉันสับสน stackoverflow.com/questions/980255/…
Zen

@ เซนใช่ฉันตรวจสอบมันเป็นความคิดเห็นแรกของคำถามของคุณ ขอบคุณ
Arnab

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