Không thể mở rộng dấu hoa thị mà không có sự cho phép thích hợp


16

Ai đó có thể giải thích cho tôi sau đây?

$ 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

Vì vậy, tôi không thể sử dụng dấu hoa thị ở đây. Tôi đã thử nó với một lệnh sudo và tôi nhận được lỗi "không có tệp như vậy" thay vì "quyền bị từ chối" ...

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

nhưng cuối cùng nó cũng hoạt động nếu tôi không sử dụng *

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

Câu trả lời:


20

Vỏ đang thực hiện việc mở rộng *ký tự đại diện là vỏ mà bạn nhập nó. Nếu vỏ có quyền đọc danh sách các tập tin trong thư mục, sau đó nó mở rộng /temp/sit/build/*tới /temp/sit/build/file, và chạy sudovới các đối số ls, -l/temp/sit/build/file. Nếu vỏ là không thể tìm thấy bất kỳ phù hợp cho /temp/sit/build/*(cho dù đó là bởi vì không có trận đấu, hoặc vì vỏ không có quyền xem các trận đấu), sau đó nó để lại mô hình một mình, và sudođược gọi với các đối số ls, -l/temp/sit/build/*.

Vì không có tệp nào được gọi /temp/sit/build/*, nên lslệnh sẽ khiếu nại nếu bạn chuyển tên đó. Nhớ lại rằng lskhông mở rộng ký tự đại diện, đó là công việc của shell.

Nếu bạn muốn mở rộng ký tự đại diện xảy ra trong một thư mục mà bạn không có quyền đọc, thì việc mở rộng phải xảy ra trong một vỏ được bắt đầu bằng sudothay vì trong vỏ gọi sudo. sudokhông tự động khởi động shell, bạn cần làm điều đó một cách rõ ràng.

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

Tất nhiên, ở đây, bạn có thể làm sudo ls -l /temp/sit/build/thay thế, nhưng điều đó không khái quát cho các mẫu khác.


1

Trong một số trường hợp hiếm hoi, bạn cần kiểm tra kỹ xem bạn đã không vô hiệu hóa tính năng tạo khối cho vỏ của bạn, thứ có thể cung cấp cho bạn No such file or directorykhi cố gắng liệt kê các tệp có ký tự đại diện ( *).

Ví dụ:

$ 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

Kiểm tra help setđể biết thêm.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.