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/file
e será executado sudo
com os argumentos ls
, -l
e /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
, -l
e /temp/sit/build/*
.
Como não há arquivo chamado /temp/sit/build/*
, o ls
comando reclama se você passar esse nome. Lembre-se de que ls
nã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 sudo
vez de no shell que chama sudo
. sudo
nã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