Tidak dapat memperluas tanda bintang tanpa izin yang sesuai

16

Bisakah seseorang menjelaskan kepada saya yang berikut ini?

$ 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

Jadi, saya tidak bisa menggunakan tanda bintang di sini. Saya sudah mencobanya dengan perintah sudo dan saya mendapatkan kesalahan "tidak ada file seperti itu" daripada "izin ditolak" ...

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

tetapi akhirnya berhasil jika saya tidak menggunakan *

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

Jawaban:

20

Shell yang melakukan ekspansi *wildcard adalah shell tempat Anda mengetiknya. Jika shell memiliki izin untuk membaca daftar file di direktori, maka itu akan diperluas /temp/sit/build/*ke /temp/sit/build/file, dan berjalan sudodengan argumen ls, -ldan /temp/sit/build/file. Jika shell tidak dapat menemukan kecocokan untuk /temp/sit/build/*(apakah itu karena tidak ada kecocokan, atau karena shell tidak memiliki izin untuk melihat pertandingan), maka ia meninggalkan polanya sendiri, dan sudodipanggil dengan argumen ls, -ldan /temp/sit/build/*.

Karena tidak ada file yang dipanggil /temp/sit/build/*, lsperintah mengeluh jika Anda memberikannya nama itu. Ingat itu lstidak memperluas wildcard, itu tugas shell.

Jika Anda ingin ekspansi wildcard terjadi di direktori di mana Anda tidak memiliki izin baca, maka ekspansi harus terjadi di shell yang dimulai dengan sudoalih-alih di shell yang memanggil sudo. sudotidak secara otomatis memulai shell, Anda perlu melakukannya secara eksplisit.

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

Di sini, tentu saja, Anda bisa melakukannya sudo ls -l /temp/sit/build/, tetapi itu tidak menggeneralisasi ke pola lain.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
1

Dalam beberapa kasus yang jarang terjadi, Anda perlu memeriksa ulang bahwa Anda belum menonaktifkan globbing untuk shell Anda yang dapat memberi Anda No such file or directorysaat mencoba membuat daftar file dengan wildcard ( *).

Sebagai contoh:

$ 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

Periksa help setinfo lebih lanjut.

kenorb
sumber