cron을 사용하여 postgresql 데이터베이스를 백업하기 위해 다음 스크립트를 만들었습니다.
백업 파일
#!/bin/bash
export PGUSER="user"
export PGPASSWORD="pass"
FECHA_ACTUAL=`date +%Y-%m-%d`
HORA_ACTUAL=`date +%H:%M`
ARCH_RESP=$FECHA_ACTUAL-$HORA_ACTUAL
pg_dump -O -Fc mydb -h localhost > /home/user/backups/backup_$ARCH_RESP.sql
find /home/user/backups/ -name '*.sql' -mtime +2 -exec rm -f {} \;
unset PGUSER
unset PGPASSWORD
이 코드를 복사하여 터미널에 붙여 넣으면 제대로 작동하지만 스크립트를 실행하려고 하면 다음 오류가 발생합니다.
user@dental:~/scripts$ ./backup.sh
내보내기: 잘못된 해석기: 해당 파일이나 디렉터리가 없습니다.
내 스크립트에 문제가 있나요? 아니면 해석이 잘못된 걸까요?
답변1
첫 번째 줄이 LF 대신 CR로만 끝나는 경우에도 동일한 오류가 발생합니다.
$ echo -en '#!/bin/bash\rexport foo=bar\n' > test.sh
$ chmod +x test.sh
$ ./test.sh
export: bad interpreter: No such file or directory
커널이 이름이 붙은 인터프리터 프로그램을 찾았지만 /bin/bash\rexport
찾지 못하고 오류가 발생합니다. Bash는 파일 이름과 함께 오류 메시지를 인쇄합니다.
bash: ./test.sh: /bin/bash\rexport: bad interpreter: No such file or directory
그러나 캐리지 리턴은 출력을 다시 줄 앞으로 이동시키기 때문에 다음과 같이 볼 수 있습니다.
export: bad interpreter: No such file or directory
그래서 문제는 줄의 끝 부분에 있는 것 같습니다.
DOS 스타일 CRLF 줄 끝의 경우 이제 줄을 끝내는 LF가 있으므로 결과가 다릅니다.
$ echo -en '#!/bin/bash\r\nexport foo=bar\n' > test.sh
$ ./test.sh
bash: ./test.sh: /bin/bash^M: bad interpreter: No such file or directory
이번에 bash가 출력에서 CR을 인용하는 것 같은 이유는 모르겠지만 ^M
.
IIRC의 줄 끝으로 별도의 CR은 이전 Mac 시스템의 잔재이며 dos2unix
기본적으로 이에 대한 수정 사항은 없는 것 같습니다. mac2unix
또는 를 사용해야 합니다 dos2unix -c mac
.
모든 스타일을 함께 혼합하고 다른 의미에서 CR이 필요하지 않은 경우 이와 같은 작업을 수행하면 CR 또는 CRLF를 Unix 스타일 LF 줄 끝으로 변환해야 합니다.
sed 's/\r/\n/g;s/\n$//' backup.sh