Asterisk kann nicht ohne entsprechende Berechtigung erweitert werden

16

Kann mir jemand folgendes erklären?

$ 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

Also kann ich das Sternchen hier nicht verwenden. Ich habe es mit einem sudo-Befehl versucht und erhalte eher den Fehler "keine solche Datei" als "Erlaubnis verweigert" ...

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

aber es klappt endlich wenn ich das nicht benutze

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

Antworten:

20

Die Shell, die die Erweiterung des *Platzhalters vornimmt, ist die Shell, in die Sie den Platzhalter eingeben. Wenn die Shell die Genehmigung hat die Liste der Dateien im Verzeichnis zu lesen, dann dehnt sie sich /temp/sit/build/*auf /temp/sit/build/fileund läuft sudomit den Argumenten ls, -lund /temp/sit/build/file. Wenn die Shell nicht in der Lage für jedes Spiel zu finden /temp/sit/build/*(ob es ist , weil es keine Übereinstimmungen gibt, oder weil die Shell keine Genehmigung , die Spiele zu sehen , hat), dann läßt sie das Muster allein, und sudowird mit den Argumenten aufgerufen ls, -lund /temp/sit/build/*.

Da keine Datei aufgerufen wird /temp/sit/build/*, lsbeschwert sich der Befehl, wenn Sie diesen Namen übergeben. Denken Sie daran, dass lsPlatzhalter nicht erweitert werden, das ist die Aufgabe der Shell.

Wenn die Platzhaltererweiterung in einem Verzeichnis erfolgen soll, für das Sie keine Leseberechtigung haben, muss die Erweiterung in einer Shell erfolgen, die von sudoanstelle der aufgerufenen Shell gestartet wird sudo. sudostartet eine Shell nicht automatisch, Sie müssen dies explizit tun.

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

Hier können Sie das natürlich auch tun sudo ls -l /temp/sit/build/, aber das verallgemeinert sich nicht auf andere Muster.

Gilles 'SO - hör auf böse zu sein'
quelle
1

In einigen seltenen Fällen müssen Sie überprüfen, ob Sie das Globbing für Ihre Shell nicht deaktiviert haben. Dies kann No such file or directorybeim Auflisten von Dateien mit Platzhalter ( *) hilfreich sein .

Beispielsweise:

$ 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

Überprüfen Sie help setfür weitere Informationen.

Kenorb
quelle