Não é possível expandir o asterisco sem a permissão adequada

16

Alguém pode me explicar o seguinte?

$ 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

Portanto, não posso usar o asterisco aqui. Eu tentei com um comando sudo e recebo um erro "sem esse arquivo" em vez de "permissão negada" ...

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

mas finalmente funciona se eu não usar o *

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

Respostas:

20

O shell que está fazendo a expansão do *curinga é o shell em que você o digita. Se o shell tiver permissão para ler a lista de arquivos no diretório, ele se expandirá /temp/sit/build/*para /temp/sit/build/filee será executado sudocom os argumentos ls, -le /temp/sit/build/file. Se o shell não conseguir encontrar nenhuma correspondência para /temp/sit/build/*(seja porque não há correspondências ou porque a shell não tem permissão para ver as correspondências), ele deixa o padrão sozinho e sudoé chamado com os argumentos ls, -le /temp/sit/build/*.

Como não há arquivo chamado /temp/sit/build/*, o lscomando reclama se você passar esse nome. Lembre-se de que lsnão expande curingas, esse é o trabalho do shell.

Se você deseja que a expansão de curinga ocorra em um diretório em que você não tem permissão de leitura, a expansão deve ocorrer em um shell iniciado, em sudovez de no shell que chama sudo. sudonão inicia um shell automaticamente, você precisa fazer isso explicitamente.

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

Aqui, é claro, você pode fazer isso sudo ls -l /temp/sit/build/, mas isso não generaliza para outros padrões.

Gilles 'SO- parar de ser mau'
fonte
1

Em alguns casos raros, é necessário verificar novamente se você não desabilitou o globbing para seu shell, o que pode ser útil No such file or directoryao tentar listar arquivos com curinga ( *).

Por exemplo:

$ 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

Verifique help setpara mais informações.

kenorb
fonte