Powłoka, która dokonuje rozwinięcia *
znaku wieloznacznego, jest powłoką, w której ją wpisujesz. Jeśli powłoka ma uprawnienia do odczytu listy plików w katalogu, a następnie rozszerza /temp/sit/build/*
się /temp/sit/build/file
i biegnie sudo
z argumentami ls
, -l
i /temp/sit/build/file
. Jeśli powłoka nie jest w stanie znaleźć żadnego meczu dla /temp/sit/build/*
(czy to dlatego, że nie istnieją żadne mecze, albo dlatego, że powłoka nie ma uprawnień do oglądania meczów), a następnie pozostawia wzór sam, a sudo
nazywa się z argumentami ls
, -l
i /temp/sit/build/*
.
Ponieważ nie ma wywołanego pliku /temp/sit/build/*
, ls
polecenie narzeka, jeśli podasz mu tę nazwę. Pamiętaj, że ls
to nie rozwija symboli wieloznacznych, to zadanie powłoki.
Jeśli chcesz, aby interpretacja symboli wieloznacznych miała miejsce w katalogu, w którym nie masz uprawnień do odczytu, wówczas ekspansja musi nastąpić w powłoce, która została uruchomiona, sudo
zamiast w powłoce, która wywołuje sudo
. sudo
nie uruchamia automatycznie powłoki, musisz to zrobić jawnie.
sudo sh -c 'ls -l /temp/sit/build/*'
Tutaj możesz oczywiście sudo ls -l /temp/sit/build/
zamiast tego zrobić , ale to nie uogólnia na inne wzorce.