ไม่สามารถขยายเครื่องหมายดอกจันโดยไม่ได้รับอนุญาต


16

บางคนสามารถอธิบายต่อไปนี้ให้ฉันได้หรือไม่

$ ls -ld /temp/sit/build/
dr-xr-s--- 3 asdf qwer 4096 Jan 31  2012 /temp/sit/build/

$ ls -ld /temp/sit/build/*
ls: /temp/sit/build/*: Permission denied

เห็นได้ชัดว่าฉันไม่สามารถใช้เครื่องหมายดอกจันที่นี่ ฉันลองด้วยคำสั่ง sudo และฉันได้รับข้อผิดพลาด "ไม่มีไฟล์ดังกล่าว" แทนที่จะ "ปฏิเสธสิทธิ์" ...

sudo ls -l /temp/sit/build/*
ls: /temp/sit/build/batch*: No such file or directory

แต่ในที่สุดก็ใช้งานได้หากฉันไม่ได้ใช้ *

sudo ls -l /temp/sit/build/
total 4
dr-xr-s--- 11 asdf qwer 4096 Oct  3 23:31 file

คำตอบ:


20

เชลล์ที่ทำการขยายตัวของ*wildcard นั้นคือเชลล์ที่คุณพิมพ์ ถ้าเปลือกมีสิทธิ์ในการอ่านรายชื่อของไฟล์ในไดเรกทอรีแล้วมันขยาย/temp/sit/build/*ไป/temp/sit/build/fileและวิ่งsudoกับข้อโต้แย้งls, และ-l /temp/sit/build/fileถ้าเปลือกไม่สามารถที่จะหาคู่ใด ๆ/temp/sit/build/*(ไม่ว่าจะเป็นเพราะไม่มีการแข่งขันหรือเพราะเปลือกมีสิทธิ์ในการดูการแข่งขันไม่ได้) แล้วมันจะออกรูปแบบคนเดียวและsudoเรียกว่ามีข้อโต้แย้งls, และ-l/temp/sit/build/*

เนื่องจากไม่มีแฟ้มที่เรียกว่า/temp/sit/build/*การlsสั่งบ่นถ้าคุณผ่านมันชื่อนั้น จำlsได้ว่าไม่ได้ขยาย wildcard นั่นเป็นหน้าที่ของเชลล์

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

sudo sh -c 'ls -l /temp/sit/build/*'

แน่นอนที่นี่คุณสามารถทำได้sudo ls -l /temp/sit/build/แทน แต่นั่นไม่ได้พูดคุยกับรูปแบบอื่น ๆ


1

ในบางกรณีที่ไม่ค่อยเกิดขึ้นคุณต้องตรวจสอบอีกครั้งว่าคุณไม่ได้ปิดการใช้งานแบบวงกลมสำหรับเชลล์ซึ่งอาจให้คุณNo such file or directoryเมื่อพยายามแสดงรายการไฟล์ด้วยไวด์การ์ด ( *)

ตัวอย่างเช่น:

$ ls /tmp/sit/build/*
/tmp/sit/build/file
$ set -f
$ ls /tmp/sit/build/*
ls: cannot access /tmp/sit/build/*: No such file or directory
$ set +f
$ ls /tmp/sit/build/*
/tmp/sit/build/file

ตรวจสอบhelp setข้อมูลเพิ่มเติม

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