별표는 적절한 허가 없이 확장될 수 없습니다.

별표는 적절한 허가 없이 확장될 수 없습니다.

누군가 나에게 다음 사항을 설명해 줄 수 있나요?

$ 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 명령을 사용해 보았지만 "권한이 거부되었습니다" 대신 "해당 파일 없음" 오류가 발생합니다...

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

답변1

와일드카드 확장을 수행하는 쉘은 *와일드카드 문자를 입력하는 쉘입니다. 쉘에 디렉토리의 파일 목록을 읽을 수 있는 권한이 있는 경우 인수를 사용하여 /temp/sit/build/*으로 확장 하고 를 실행합니다 . 셸이 일치하는 항목을 찾을 수 없는 경우 (일치 항목이 없거나 셸에 일치 항목을 볼 수 있는 권한이 없기 때문에) 패턴을 그대로 두고 인수 , 및 를 사용하여 호출합니다 ./temp/sit/build/filesudols-l/temp/sit/build/file/temp/sit/build/*sudols-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/다른 모드로 일반화되지는 않습니다.

답변2

드문 경우지만 쉘에 와일드카드가 비활성화되어 있는지 다시 확인해야 합니다. 이로 인해 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.

관련 정보