ตามที่หัวเรื่องบอกว่ามีความแตกต่างของระบบไฟล์ * 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พวกเขาจะเป็นเส้นทางเดียวกันเสมอหนึ่งที่ระบุไว้ชัดเจนกว่าอื่น ๆ ไม่ใช่คำสั่งทั้งหมดที่ทำงานด้วยวิธีนี้เมื่อประมวลผลข้อโต้แย้ง แต่ส่วนใหญ่ทำ