"sudo cp"가 파일을 찾을 수 없는 이유는 무엇입니까?

"sudo cp"가 파일을 찾을 수 없는 이유는 무엇입니까?

이 문제에 대해 논리적으로 설명할 수 있는 사람은 누구입니까?

이 명령을 실행할 수 없습니다.

sudo cp /data/*20150522* /backup/

cp: cannot stat `/data/*20150522*': No such file or directory

그리고 루트로 전환하면 문제없이 작동합니다.

나는 다음과 같은 액세스 권한을 가진 /data 디렉토리 내부의 파일을 나열하는 올바른 권한을 갖는 것에 관한 것이라고 확신합니다.

drwxrwx--- 1 root root 

하지만 여기서는 sudo로 명령을 실행하고 있는데 여기서 문제는 무엇입니까?

답변1

쉘은 확장된 결과를 에 전달하기 전에 glob 패턴의 확장을 시도합니다 cp(실제로 결과를 전달한 sudo다음 변경되지 않은 결과를 에 전달합니다 cp). 쉘(루트가 아닌 사용자로 실행 중)은 디렉토리를 탐색할 수 없으므로 cp인수 목록에서 확장되지 않은 패턴을 수신하게 됩니다.

cp전역 확장 자체는 수행하지 않습니다. 파일 이름 목록이 필요합니다. 패턴이 포함된 문자열은 파일 이름을 지정하지 않습니다.

아마도 작업을 수행하는 가장 간단한 방법은 하위 셸에서 명령을 호출하는 것입니다. 큰따옴표( ") 또는 작은따옴표( ) 로 명령을 인용하십시오 '.

sudo sh -c "cp /data/*20150522* /backup/"
sudo sh -c 'cp /data/*20150522* /backup/'

이는 하위 쉘이 명령을 호출하기 전에 명령 문자열에서 glob 패턴을 확장하기 때문에 작동합니다. 하위 쉘이 아래에서 루트로 실행 중이므로 sudo확장이 성공합니다.

하위 쉘에 명령을 인용하기 위해 큰따옴표를 사용하면 명령을 호출하기 전에 상위 쉘이 쉘 변수를 확장할 수 있습니다 sudo. 하위 셸로 변수를 확장하려면 작은따옴표를 대신 사용해야 합니다. 이 경우 변수가 없으므로 동일합니다. 그러나 동작의 차이를 확인하기 위해 하나를 추가할 수 있습니다.

sudo sh -c "echo $USER; cp /data/*20150522* /backup/"
sudo sh -c 'echo $USER; cp /data/*20150522* /backup/'

첫 번째 명령은 사용자 이름을 표시하고 두 번째 명령은 루트 사용자 이름을 표시합니다.

관련 정보