มีความแตกต่างระหว่างเส้นทาง "ไฟล์" และ "./file" หรือไม่


12

ตามที่หัวเรื่องบอกว่ามีความแตกต่างของระบบไฟล์ * NIX หรือไม่? เช่นls fileและls ./file


1
คุณอาจถามunix.stackexchange.com - ตอบเพื่อให้ห่างไกลทุกคนมีข้อมูลที่ดีในพวกเขา แต่ไม่รู้สึกเหมือนคำตอบ
Rob Starling

คำตอบ:


14

ฉันไม่ได้คลั่งไคล้กับคำอธิบายของ 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\ \*นี้อาจจะเป็นวิธีที่ดีเพื่อให้มั่นใจว่าชุดใดก็ตามของคำสั่งอย่างน้อยสอดคล้องกับที่ระบุก่อนชื่อจะไม่หลบหนีหลังจากที่ตัวละคร./ ./
Spooler

2
มันเกิดขึ้นว่าเนื่องจากการหลบหนีถูกหลบหนีโดยเชลล์ไม่ใช่คำสั่งและการแยกวิเคราะห์จะถูกวิเคราะห์โดยคำสั่งการหลบหนีหรือการอ้างอิง - ไม่มีประโยชน์ใด ๆ
Dewi Morgan

2
คุณทำให้มันฟังดูเหมือนrm "-rf rmbomb *"จะทำสิ่งที่ไม่ดีจริง ๆ แทนที่จะrmพิมพ์ข้อผิดพลาด มันอันตรายหากคุณลืมอ้างชื่อไฟล์ดังนั้นการแบ่งคำจึงเกิดขึ้น (โดยเฉพาะในเชลล์สคริปต์ที่คุณเรียกใช้rm $fileแทนrm "$file"แต่ในกรณีนั้น*จะไม่ขยายเนื่องจากการขยายแบบ glob ไม่ได้เกิดขึ้นกับเนื้อหาของการขยายตัวแปรหากคุณต้องการคุณจะต้องมีeval) อย่างไรก็ตามถ้าชื่อไฟล์ของคุณแตกคำก่อนที่จะส่งไปยัง rm ฉันจะสร้างไฟล์ชื่อspace -rf .หรืออะไรก็แล้วแต่rm ./$iก็ไม่ช่วยอะไร
Peter Cordes

1
BTW ข้อความแสดงข้อผิดพลาดที่เกิดขึ้นจริงคือrm: invalid option -- ' 'เมื่อมันพยายามตีความช่องว่างหลังจาก-rfเป็นสวิตช์ตัวเดียวเพราะมันเป็นส่วนหนึ่งของอาร์กิวเมนต์เดียวกัน (และใช่ฉันวิ่งไปในไดเรกทอรีที่ว่างเปล่าในกรณีที่ฉันได้มองข้ามบางสิ่งบางอย่างและมันเป็นอันตรายจริง ๆ : P)
Peter Cordes

2
@PeterCordes: wordsplitting และ globbing DOES เกิดขึ้นกับผลลัพธ์ของการขยายตัวของตัวแปรที่ไม่ได้กล่าวถึงและการแทนที่คำสั่งยกเว้นว่าถูกระงับIFS=''และ-fตามลำดับ ตัวอย่างที่หายากก็คือawkปฏิบัติต่อตัวถูกดำเนินการ (นอกเหนือจากตัวถูกดำเนินการแรกที่เป็นสคริปต์) ที่มีรูปแบบfoo=barการมอบหมายให้ดำเนินการ แต่./foo=barเป็นไฟล์ที่จะอ่าน
dave_thompson_085

7

ใช่.

โดยการออกfileบรรทัดคำสั่ง BASH จะค้นหาตัวแปรสภาพแวดล้อม $ PATH ของคุณสำหรับไฟล์ของชื่อนั้น หากไฟล์นั้นอยู่ในไดเรกทอรีภายในตัวแปร $ PATH ของคุณมันจะไม่ถูกค้นพบ

.หมายถึงไดเรกทอรีปัจจุบัน ./หมายถึงภายในไดเรกทอรีปัจจุบันในแง่ที่เกี่ยวข้อง มันเทียบเท่ากับการพูดอะไรบางอย่างเช่น/home/sheogorath/shivering/isles.imgเมื่อเรียกใช้./isles.imgในขณะที่ทำงานใน/home/sheogorath/shivering/ไดเรกทอรี

ดังนั้นจึงมักใช้เพื่อเรียกใช้ไฟล์ภายในไดเรกทอรีทำงาน "ในสถานที่"

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

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


1
นั่นคือทุบตี แต่ฉันสงสัยเกี่ยวกับการแก้ปัญหาเส้นทางโดยทั่วไป
Sergey Alaev

1
นี่เป็นวิธีที่กระสุนที่ฉันเคยได้ยินเกี่ยวกับงาน BASH เป็นเพียงการใช้งานบ่อยที่สุด
Spooler

4
$ PATH นั้นเกี่ยวข้องกับคำสั่งเท่านั้นและไม่มีอะไรเกี่ยวข้องกับอาร์กิวเมนต์ชื่อไฟล์ที่ทำตามคำสั่งเช่นที่lsกล่าวถึงในคำถามดั้งเดิม นั่นคือความแตกต่างระหว่างการอ้างอิงเส้นทางสัมพัทธ์ (สัมพันธ์กับไดเรกทอรีการทำงานปัจจุบัน) Ie ../../dir/filenameและเส้นทางสัมบูรณ์ /path/to/dir/filename
HBruijn

1
+1 สำหรับ Sheogorath ... และคำตอบที่ถูกต้อง
Corey Ogburn

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