실제 x 응용 프로그램 등에서 구현하여 일부 스크립트를 더 우아하게 만들려고 노력하고 있습니다.
스크립트의 어느 시점에서 우리는 기본적으로 마운트된 이동식 저장 장치의 모든 것을 가져와 tmp 작업 폴더 내의 지정된 폴더에 복사하려고 합니다. 쉘에서 실행하면 원활하게 실행됩니다. 코드에서 실행하면 실패합니다.
복사 명령:
cp -avfr /tmp/mnt221234jk/* /tmp/mnt23255/disk1/
기본 응용 프로그램에서 발생하는 오류는 다음과 같습니다.
cp: cannot stat: '/tmp/mnt221234jk/*' file not found.
이상한 점은 그것이 확실히 존재하고, 애플리케이션을 실행하는 사용자에게 적절한 권한이 있다는 것 등입니다. stat /tmp/mnt221234jk/*
쉘에서 cp 명령을 실행할 수 있으며 둘 다 잘 작동합니다.
그 외에 /*
파일복사 소스에서 생략하면 작동은 되지만 대상에 mnt221234jk
내가 원하는 이름이 아닌 새 폴더가 생성됩니다.
몇 가지 참고 사항: 쉘 명령을 실행하는 코드는 확실히 작동하고 잘 실행됩니다. 하지만 작업 경로나 그와 유사한 것이 필요한 것은 아마도 조금 이상할 것입니다.
파일이 존재하지 않는다는 이유로 통계적 오류가 발생하지 않으면 누구에게나 경고음이 울리나요?
권한 등을 사용하여 파일 구조를 재귀적으로 효율적으로 복사할 수 있는 대체 셸 명령이 있다면 이를 다른 방식으로 구현해 보려고 합니다.
답변1
문제가 있는 스크립트의 호출은 와일드카드 파일이 아니라 셸에 의해 실행됩니다. 어떻게 부르는지는 잘 모르겠지만 파일을 반복하거나 반복하는 방법을 찾아야 합니다.
답변2
글쎄, 미리 사과드립니다. 실제 문제는 실제로 매우 간단합니다. 글로빙 파일 문제이지만 쉘이 명시적으로 해당 문제를 비활성화했거나 상대 경로 때문이 아닙니다.
"쉘 스크립트"와 쉘 명령을 시작하지만 bash/sh/tcsh 등의 컨텍스트 외부에 있습니다. cp를 직접 실행하면 문제가 발생할 뿐입니다.
실행 중
/bin/bash -c "cp /blah/* /someotherdir/"
아주 잘 작동합니다. 힌트를 주셔서 감사합니다!
답변3
스크립트에 버그가 있습니다. 아직 스크립트를 표시하지 않았기 때문에 어디에 있는지 알 수 없습니다.
/tmp/mnt221234jk/*
제한된 설명을 보면 동일한 권한으로 실행되는 명령이 디렉터리를 통과할 수 있더라도 셸이 파일 목록으로 확장되는 것으로 나타나지 않습니다 . 그래서 가능한 설명은 당신이 와일드카드를 어느 시점에 cp
꺼두었다는 것입니다. 로 다시 엽니다 .set -f
set -o noglob
set +f