ตามที่หัวเรื่องบอกว่ามีความแตกต่างของระบบไฟล์ * NIX หรือไม่? เช่นls file
และls ./file
ตามที่หัวเรื่องบอกว่ามีความแตกต่างของระบบไฟล์ * NIX หรือไม่? เช่นls file
และls ./file
คำตอบ:
ฉันไม่ได้คลั่งไคล้กับคำอธิบายของ SmallLoanOf1M มันถูกต้องทางเทคนิค แต่คำตอบในวิธีที่ไม่ตรงกับตัวอย่างการใช้งานในคำถาม
ตัวอย่างเช่นนี่คือความแตกต่างที่สำคัญอย่างหนึ่งระหว่างทั้งสองจากคำถาม: "file" และ "./file"
จะเกิดอะไรขึ้นถ้าไฟล์นั้นถูกตั้งชื่อด้วยตัวอักษรที่ถูกวิเคราะห์โดยเชลล์? โดยเฉพาะอย่างยิ่งเกี่ยวกับตัวละครที่ตีความโดยคำสั่งหนึ่งที่กำลังทำงานอยู่
โดยเฉพาะอย่างยิ่งอักขระ "เส้นประ": "-" แต่ตัวละครอื่น ๆ มีความหมายต่อเชลล์
ตัวอย่าง. ไฟล์ของฉันชื่อ "-dingle"
ลองรายการไฟล์:
ls -dingle
# ls -dingle
ls: invalid option -- 'e'
ยิ่งแย่ไปกว่านั้นถ้าไฟล์นั้นมีชื่อว่า " -rf rmbomb *
" ตอนนี้ลองลบออก
rm "-rf rmbomb *"
ฉันจะไม่ลองใช้ตัวอย่างนั้น แต่หวังว่าคุณจะได้แนวคิด
ดังนั้นคุณจะแสดงรายการไฟล์ที่จ้องมองด้วยขีดได้อย่างไร ใช้./
ด้านหน้า
# ls ./-dingle
./-dingle
เหมือนกันสำหรับ rm
ls \-dingle
ls \-rf\ rmbomb\ \*
นี้อาจจะเป็นวิธีที่ดีเพื่อให้มั่นใจว่าชุดใดก็ตามของคำสั่งอย่างน้อยสอดคล้องกับที่ระบุก่อนชื่อจะไม่หลบหนีหลังจากที่ตัวละคร./
./
rm "-rf rmbomb *"
จะทำสิ่งที่ไม่ดีจริง ๆ แทนที่จะrm
พิมพ์ข้อผิดพลาด มันอันตรายหากคุณลืมอ้างชื่อไฟล์ดังนั้นการแบ่งคำจึงเกิดขึ้น (โดยเฉพาะในเชลล์สคริปต์ที่คุณเรียกใช้rm $file
แทนrm "$file"
แต่ในกรณีนั้น*
จะไม่ขยายเนื่องจากการขยายแบบ glob ไม่ได้เกิดขึ้นกับเนื้อหาของการขยายตัวแปรหากคุณต้องการคุณจะต้องมีeval
) อย่างไรก็ตามถ้าชื่อไฟล์ของคุณแตกคำก่อนที่จะส่งไปยัง rm ฉันจะสร้างไฟล์ชื่อspace -rf .
หรืออะไรก็แล้วแต่rm ./$i
ก็ไม่ช่วยอะไร
rm: invalid option -- ' '
เมื่อมันพยายามตีความช่องว่างหลังจาก-rf
เป็นสวิตช์ตัวเดียวเพราะมันเป็นส่วนหนึ่งของอาร์กิวเมนต์เดียวกัน (และใช่ฉันวิ่งไปในไดเรกทอรีที่ว่างเปล่าในกรณีที่ฉันได้มองข้ามบางสิ่งบางอย่างและมันเป็นอันตรายจริง ๆ : P)
IFS=''
และ-f
ตามลำดับ ตัวอย่างที่หายากก็คือawk
ปฏิบัติต่อตัวถูกดำเนินการ (นอกเหนือจากตัวถูกดำเนินการแรกที่เป็นสคริปต์) ที่มีรูปแบบfoo=bar
การมอบหมายให้ดำเนินการ แต่./foo=bar
เป็นไฟล์ที่จะอ่าน
ใช่.
โดยการออกfile
บรรทัดคำสั่ง BASH จะค้นหาตัวแปรสภาพแวดล้อม $ PATH ของคุณสำหรับไฟล์ของชื่อนั้น หากไฟล์นั้นอยู่ในไดเรกทอรีภายในตัวแปร $ PATH ของคุณมันจะไม่ถูกค้นพบ
.
หมายถึงไดเรกทอรีปัจจุบัน ./
หมายถึงภายในไดเรกทอรีปัจจุบันในแง่ที่เกี่ยวข้อง มันเทียบเท่ากับการพูดอะไรบางอย่างเช่น/home/sheogorath/shivering/isles.img
เมื่อเรียกใช้./isles.img
ในขณะที่ทำงานใน/home/sheogorath/shivering/
ไดเรกทอรี
ดังนั้นจึงมักใช้เพื่อเรียกใช้ไฟล์ภายในไดเรกทอรีทำงาน "ในสถานที่"
แก้ไข:
ในตัวอย่างของคุณls
ถูกเรียกโดยเปลือกและพบโดยใช้ตัวแปรเส้นทาง อาร์กิวเมนต์จะถูกประมวลผลในไดเรกทอรีทำงานของคุณไม่ว่ามันจะเป็นอะไร เนื่องจากนี่เป็นค่าเริ่มต้นสำหรับls
คุณจะไม่เห็นความแตกต่างระหว่างการระบุfile
และการระบุอย่างชัดเจน./file
เนื่องจากทั้งคู่ชี้ไปที่ไดเรกทอรีปัจจุบันของคุณ
คำสั่งบางคำสั่งจะยอมรับพา ธ ไฟล์ในไดเรกทอรีทำงานและบางคนคาดว่าจะให้คุณระบุไฟล์ในไดเรกทอรีที่กำหนดไว้ล่วงหน้าผ่านการกำหนดค่า ในบรรดาคำสั่งที่ยอมรับไฟล์เป็นอาร์กิวเมนต์คำสั่งเหล่านี้ใช้กันน้อย
ls
กล่าวถึงในคำถามดั้งเดิม นั่นคือความแตกต่างระหว่างการอ้างอิงเส้นทางสัมพัทธ์ (สัมพันธ์กับไดเรกทอรีการทำงานปัจจุบัน) Ie ../../dir/filename
และเส้นทางสัมบูรณ์ /path/to/dir/filename
ls
พวกเขาจะเป็นเส้นทางเดียวกันเสมอหนึ่งที่ระบุไว้ชัดเจนกว่าอื่น ๆ ไม่ใช่คำสั่งทั้งหมดที่ทำงานด้วยวิธีนี้เมื่อประมวลผลข้อโต้แย้ง แต่ส่วนใหญ่ทำ