상상하다: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 redirect
Bash는 사용자가 어떤 항목을 읽고 싶은지 알 수 없기 때문에 오류가 발생합니다 .
파일이 여러 개인 경우 해당 파일로 무엇을 할지 결정해야 합니다. 각 파일에 대해 명령을 한 번 실행하고 각 파일의 입력을 차례로 리디렉션하시겠습니까? 아니면 명령을 총 한 번 실행하고 파일 중 하나에서 입력을 리디렉션하시겠습니까? 하지만 어느 것?