มันเป็นการดีหรือไม่ที่จะต้องใช้เครื่องหมายทับซ้ายสุดในชื่อไดเรกทอรี?


9

ฉันต้องการขอให้ผู้ใช้ของสคริปต์ทุบตีของฉันผ่านเส้นทางไดเรกทอรีเป็นอาร์กิวเมนต์ ข้อใดต่อไปนี้เป็นแบบฝึกหัดการเขียนโปรแกรมที่ดี?

  • ต้องการให้ผู้ใช้ป้อน / (เครื่องหมายสแลช)
  • ต้องการให้ผู้ใช้ไม่ได้ป้อน / ต่อท้าย (เครื่องหมายสแลช)

3
โปรดทราบว่าการrsyncทำงานแตกต่างกันในทางที่สำคัญมากขึ้นอยู่กับการปรากฏตัวของต่อท้าย/และอื่น ๆ ในบางกรณีที่คุณต้องการที่จะปรับเพื่อความมั่นคงและอื่น ๆ ที่คุณต้องการที่จะผ่านเรียบร้อยที่จะใช้สิ่งที่ผู้ใช้กล่าวว่า (ถ้าพวกเขา รู้ว่าพวกเขากำลังคุยด้วยrsync)
sh1

อีกสิ่งหนึ่งที่ทำให้ฉันประหลาดใจเมื่อเร็ว ๆ นี้ก็คือls -l dirพฤติกรรมนั้นแตกต่างกันls -l dir/หากdirเป็น symlink ไปยังไดเรกทอรี
Flimm

คำตอบ:


27

แนวทางปฏิบัติที่ดีที่สุดคือการไม่คิด

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

ไม่มีอะไรน่ารำคาญสำหรับผู้ใช้มากกว่าที่จะจำได้ว่าจะเพิ่มเครื่องหมายทับหรือไม่


6
ควันหลง: เสมอเส้นทางแยกที่มีความเหมาะสมบรรทัดคำสั่งเครื่องมือ - dirname, และbasename readlinkปัญหาที่พบบ่อยมากคือการใช้${path##*/}แทนbasenameแต่ถ้าเส้นทางจบลงด้วยเครื่องหมายทับที่ส่งกลับสตริงที่ว่างเปล่าแทนองค์ประกอบเส้นทางที่ผ่านมา
l0b0

1
+1 สำหรับการใช้คลาสยูทิลิตี้ ฉันไม่สามารถบอกได้ว่ากี่ครั้งที่ฉันได้เห็นนักพัฒนาคิดค้นล้อใหม่เมื่อมันมาถึงเส้นทางการประกอบเมื่อกรอบส่วนใหญ่สามารถทำได้อย่างง่ายดายในปัจจุบัน
RationalGeek

1
นอกจากนี้ฉันยังรู้สึกรำคาญอย่างมากเมื่อบางแอปพลิเคชันต้องการให้ฉันทำสิ่งนี้ด้วยวิธีเฉพาะ และบางครั้งผู้ใช้ไม่สามารถควบคุมวิธีเขียนเส้นทางนั้น: บางครั้งพวกเขาก็เขียนดังนั้นใช่พวกเขาเลือกที่จะเขียนด้วยหรือไม่ต่อท้ายสแลช แต่ในกรณีที่ผู้ใช้เติมข้อความอัตโนมัติโดยใช้ TAB เชลล์จำนวนมากใส่เครื่องหมายสแลช คุณต้องการให้ผู้ใช้ลบหรือไม่ และที่น่ารำคาญยิ่งกว่าก็คือเมื่อแอปพลิเคชันทำงานแตกต่างกันหากคุณใส่เครื่องหมายสแลชในไดเรกทอรีที่ส่งผ่านเป็นอาร์กิวเมนต์ ( rsyncฉันกำลังมองคุณ)
Carlos Campderrós

เมื่อเร็ว ๆ นี้ฉันต้องการตรวจสอบสแลชต่อท้ายจากอินพุตของผู้ใช้เพื่อใช้กับ rsync (เนื่องจากมีความไวต่อสิ่งเหล่านี้) ดังที่ @ChrisF ตั้งข้อสังเกตมันเป็นวิธีปฏิบัติที่ดีที่สุดที่จะถือว่าไม่มี ฉันคิดวิธีต่อไปนี้อย่างสง่างามโดยสมมติว่าไม่ใช่: ${STR}$(printf \\$(printf '%03o' $(($(printf '%d' "'${STR:(-1)}")==47?0:47))))ฉันยังบันทึกไว้ในส่วนสำคัญเพื่อความชัดเจน: เพิ่มหรือลบเครื่องหมายสแลชต่อท้ายด้วยการทุบตี
John Mark Mitchell

10

เนื่องจาก bash จะข้ามหลายสแลชคุณสามารถสรุปได้อย่างปลอดภัยว่าผู้ใช้ไม่ได้ใส่เครื่องหมายสแลชต่อท้ายในพา ธ และเพิ่มสแลชด้วยตนเอง

cat /etc/hosts

เป็นเหมือนกัน

cat /////etc//////////hosts

ดังนั้นสคริปต์ของคุณอาจมีลักษณะเช่นนั้น:

echo -n "enter path: "
read path
if [ -f $path/myfile ]
then
  echo "found myfile!"
else
  echo "nope"
fi

และคุณไม่ต้องกังวลว่าผู้ใช้จะเข้าสู่เส้นทาง / ในเส้นทางหรือไม่


5
นิด: นั่นไม่ใช่bashพฤติกรรมเคอร์เนลทำ
Blrfl

7

จอน Postel ปลายมีคำแนะนำที่ดีในส่วน 3.2 ของRFC 760ที่ใช้ที่นี่:

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


3

ตามหลักการแล้วเครื่องหมายทับจะไม่เป็นส่วนหนึ่งของชื่อ เครื่องหมายทับเป็นตัวคั่นระหว่างชื่อเท่านั้น home-dir ของฉันคือ / home / stefan และไม่ใช่ / home / stefan /

หากคุณไม่คาดหวังว่าจะมีการฟันต่อท้ายคุณจะไม่ล้มเหลวหากมีอย่างใดอย่างหนึ่งตามที่ ammoQ จดบันทึกไว้แล้ว แต่คุณสามารถรวมชื่อและ vars เข้าด้วยกันได้อย่างง่ายดายเพราะคุณไม่จำเป็นต้องใส่เครื่องหมายทับ:

a="/home"
b="stefan"

dir=$a/$b

0

การขอให้ไดเรกทอรีต้องไม่มีเครื่องหมายสแลชต่อท้ายจะน่ารำคาญอย่างยิ่งสำหรับการใช้งานแบบโต้ตอบบนคอนโซล: การเติมข้อมูลอัตโนมัติด้วย TAB จะเพิ่มเครื่องหมายสแลชท้ายสำหรับไดเรกทอรีโดยอัตโนมัติ

ดังนั้นคุณต้องอนุญาตอย่างแน่นอนว่าไดเรกทอรีนั้นมีการระบุด้วยเครื่องหมายสแลช

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