쉘에서 직접 잘 작동하는 tar 명령줄이 있습니다.
tar --exclude=out/pictures/\*.{jpg,gif,png,jpeg} --exclude=tmp/\*.{txt,php} --exclude=log/\*.{log,sql} -cvf /backups/mydomain.tar -C /var/www/vhosts/mydomain.com/httpdocs content
이 명령을 bash 스크립트에 넣고 실행하면 제외 매개변수가 무시됩니다.
나는 다음과 같은 몇 가지 다른 구문을 시도했습니다.
tar --exclude="out/pictures/\*.{jpg,gif,png,jpeg}" -cvf /backups/mydomain.tar -C /var/www/vhosts/mydomain.com/httpdocs content
tar --exclude='out/pictures/\*.{jpg,gif,png,jpeg}' -cvf /backups/mydomain.tar -C /var/www/vhosts/mydomain.com/httpdocs content
tar --exclude out/pictures/\*.{jpg,gif,png,jpeg} -cvf /backups/mydomain.tar -C /var/www/vhosts/mydomain.com/httpdocs content
tar --exclude= out/pictures/\*.{jpg,gif,png,jpeg} -cvf /backups/mydomain.tar -C /var/www/vhosts/mydomain.com/httpdocs content
그러나 아무것도 작동하지 않습니다. 제외 매개변수는 단순히 무시됩니다.
간단한 --exclude는 --exclude="tmp"
예상대로 작동합니다. 매개변수를 사용하기 시작하면 내가 가정하는 구문이 깨집니다.
우분투 18.04.5에서 tar(GNU tar) 1.29를 실행 중입니다.
답변1
브레이크 확장은 sh가 아닌 bash에서만 작동합니다. Shebang이 bash로 설정되어 있는지 확인하십시오.
#!/usr/bin/env bash
스크립트를 실행 가능하게 만들고 직접 호출하세요.
chmod +x myscript.sh
./myscript.sh
명령 앞에 echo를 추가하여 언제든지 확장을 확인할 수 있습니다.
echo tar --exclude=out/pictures/\*.{jpg,gif,png,jpeg} --exclude=tmp/\*.{txt,php} --exclude=log/\*.{log,sql} -cvf /backups/mydomain.tar -C /var/www/vhosts/mydomain.com/httpdocs content
답변2
음, 오늘 중요한 것을 배웠습니다.
Bash 쉘은 중괄호 확장을 지원합니다. sh 쉘 (sh는 쉘인가요?) 하지만 아닙니다.
저처럼 스크립트를 실행시키면 sh myscript.sh
sh shell을 이용해 스크립트가 실행됩니다. bash myscript.sh
즉시 적용됩니다.
하지만 sh 파일의 링크가 #!/bin/bash
bash를 사용하여 스크립트를 실행하도록 강제하면 안 되나요?
누군가 이것을 설명할 수 있나요? 조금 혼란스러워요.
이것을 ./script.sh로 실행하면 커널이 첫 번째 줄(shebang)을 읽은 다음 bash를 호출하여 스크립트를 해석하게 됩니다. 시스템의 기본 sh가 사용하는 쉘을 사용하여 sh script.sh로 실행하십시오(Ubuntu에서는 Dash이며 sh와 호환되지만 Bash의 일부 추가 기능을 지원하지 않습니다).
그것이 모든 것을 설명하겠지만 내 우분투의 기본 셸 echo $SHELL
은 bash입니다(이 인용문은 2010년의 것이므로 당시 우분투의 기본 셸은 대시라고 가정합니다).
에 해당하더라도 이해하고 싶습니다 bash myscript.sh
.
답변3
시도 해봐:
tar --exclude="out/pictures/*.{jpg,gif,png,jpeg}" -cvf /backups/mydomain.tar -C "/var/www/vhosts/mydomain.com/httpdocs content"