쉘 스크립트에서 파일 이름의 와일드카드가 계속 실패합니다.

쉘 스크립트에서 파일 이름의 와일드카드가 계속 실패합니다.

상상하다:mongodb 덤프를 복원하기 위해 docker 컨테이너에 로그인하고 있습니다. 이 볼륨에는 덤프 파일이 하나만 있습니다.

파일 이름에 와일드카드를 사용하면 다음 오류가 발생하지만 전체 파일 이름을 지정하면 작동합니다. 포럼을 검색하는 데 몇 시간을 보냈지만 답변을 찾을 수 없습니다. 내 스크립트에 무엇이 빠졌나요?

root@141782f66c37:/data/backup# ./mongoretore.sh
./mongoretore.sh: line 2: dump_06-11-2020_20-32-15.dump: command not found
./mongoretore.sh: line 2: `*.dump`: ambiguous redirect

피복재

#!/bin/bash
mongorestore --drop --archive < dump_06-11-2020_20-32-15.dump

작동 안함

#!/bin/bash
mongorestore --drop --archive < `*.dump`

답변1

... < `*.dump`

여기서 리디렉션 연산자 다음 부분은 명령 대체입니다 $(*.dump). 이는 내부적으로 셸 볼과 같은 보다 현대적인 구문을 사용하여 작성하는 것이 가장 좋습니다. glob은 glob으로 끝나는 모든 파일 이름을 확장한 .dump다음 이를 명령으로 실행합니다.

귀하의 경우 생성된 명령 dump_06-11-2020_20-32-15.dump자체는 일치하는 유일한 파일인 경우이고, 다른 파일이 있는 경우 다른 파일 이름이 뒤따릅니다. 어떤 경우든 PATH명령에 해당 이름의 명령이 포함되어 있지 않으므로 셸에서 오류가 발생합니다. 그런 다음 리디렉션이 실패했기 때문에 또 다른 오류가 발생합니다. 아마도 명령 대체가 빈 문자열을 출력하기 때문일 것입니다.

x=
... < $x

이제 질문은 무엇을 하고 싶은가 입니다. 일반적으로 *현재 디렉토리가 일반적으로 위치에 있지 않아 PATH작동하지 않기 때문에 일반 명령을 사용하여 작업 디렉토리에서 파일을 실행하려고 시도하지 않습니다 . 알려진 이름의 파일만 읽으려는 경우 올바른 구문은 백틱이 없는 것입니다.

... < filename.dump

또는 파일 이름은 모르지만 파일 이름이 하나만 있다는 것을 알고 있는 경우 glob을 사용할 수 있습니다.

... < *.dump

이 기능은 디렉터리에 일치하는 파일이 하나만 있는 한 작동합니다. 초과하면 ambiguous redirectBash는 사용자가 어떤 항목을 읽고 싶은지 알 수 없기 때문에 오류가 발생합니다 .

파일이 여러 개인 경우 해당 파일로 무엇을 할지 결정해야 합니다. 각 파일에 대해 명령을 한 번 실행하고 각 파일의 입력을 차례로 리디렉션하시겠습니까? 아니면 명령을 총 한 번 실행하고 파일 중 하나에서 입력을 리디렉션하시겠습니까? 하지만 어느 것?

관련 정보