적절한 허가없이 별표를 확장 할 수 없습니다 2012 /temp/sit/build/ $ ls -ld

누군가 나에게 다음을 설명 할 수 있습니까?

$ 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

그래서 견습 적으로 여기서 별표를 사용할 수 없습니다. sudo 명령으로 시도했는데 “permission denied”가 아닌 “no such file”오류가 발생합니다 …

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

하지만 내가 *를 사용하지 않으면 마침내 작동합니다.

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


답변

*와일드 카드 확장을 수행 하는 쉘은 입력하는 쉘입니다. 쉘이 디렉토리에있는 파일 목록을 읽을 수있는 권한이 있다면, 그것은 확장 /temp/sit/build/*/temp/sit/build/file, 그리고 실행 sudo인수와 ls, -l/temp/sit/build/file. 쉘에 대한 일치하는 항목을 찾을 수없는 경우 /temp/sit/build/*, 다음 혼자 패턴을 남겨두고, (거기에 더 일치하지 않습니다, 또는 쉘이 경기를보고 할 권한이 없기 때문에 때문에 그것이 여부) sudo인수로 호출 ls, -l하고 /temp/sit/build/*.

라는 파일이 없으므로 해당 이름을 전달 /temp/sit/build/*하면 ls명령이 불평합니다. 리콜 ls쉘의 일이다 와일드 카드 확장하지 않습니다.

읽기 권한이없는 디렉토리에서 와일드 카드 확장을 수행하려면 sudo을 호출하는 쉘 대신 시작된 쉘에서 확장이 발생해야 합니다 sudo. sudo쉘을 자동으로 시작하지 않으므로 명시 적으로 수행해야합니다.

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

물론 여기서는 sudo ls -l /temp/sit/build/대신 할 수 있지만 다른 패턴으로 일반화되지는 않습니다.


답변

드문 경우이지만 No such file or directory와일드 카드 ( *)를 사용 하여 파일을 나열 할 때 제공 할 수있는 셸에 대한 글 로빙을 비활성화하지 않았는지 다시 확인해야합니다 .

예를 들면 다음과 같습니다.

$ 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

help set자세한 정보를 확인하십시오 .