다음 명령을 실행할 때 매우 이상한 동작이 발생했습니다. 문제를 설명하겠습니다.
다음 간단한 bash 스크립트를 고려해보세요.
#!/bin/bash
zip -r /var/backup.zip /var/www -x /ignore_dir_1/\*
전체 www
폴더를 재귀적으로 압축하고들어오지 못하게 하다 ignore_dir_1
정말 괜찮습니다.
이제 다음과 같이 스크립트를 작성하세요.
#!/bin/bash
Exclude="/ignore_dir_1/\*"
zip -r /var/backup.zip /var/www -x $Exclude
오류 없이 실행되지만제외되지 않음 ignore_dir_1
.
누구든지 이 동작을 설명할 수 있나요?
- 면책조항:
나는 다음 대안을 시도했습니다.
Exclude="/ignore_dir_1/*"
Exclude="/ignore_dir_1/***"
고쳐 쓰다:
@pLumo 덕분에 다음과 같이 변수를 따옴표 안에 넣어 문제가 해결되었습니다.
#!/bin/bash
Exclude="/ignore_dir_1/*"
zip -r /var/backup.zip /var/www -x "$Exclude"
이제 문제는 Exclude
변수에 다음이 포함되어 있는지 여부 입니다.여러 폴더, 작동하지 않습니다. 즉, 다음과 같습니다.
#!/bin/bash
Exclude="/ignore_dir_1/* /ignore_dir_2/*"
zip -r /var/backup.zip /var/www -x "$Exclude"
나는 그것을 시도했지만 "${Exclude}"
결과가 없었습니다.
답변1
당신이 쓴다면 ...
Exclude="/ignore_dir_1/* /ignore_dir_2/*"
zip -r /var/backup.zip /var/www -x "$Exclude"
, 단일 인수로 zip
수신되며 $Exclude
파일 사이의 공백을 경로의 일부로 처리합니다.
여러 매개변수를 명령에 전달하려면 를 사용해야 합니다 array
.
Exclude=("/ignore_dir_1/*" "/ignore_dir_2/*")
zip -r /var/backup.zip /var/www -x "${Exclude[@]}"
이렇게 하면 항목이 개별적으로 확장되어 명령에 인수로 전달됩니다.
답변2
플루모의 닌자 :-P
배열을 사용하는 것이 좋습니다.
#!/bin/bash
echo "directory tree ---------------------------------------------------"
find
echo "without exclusions -----------------------------------------------"
echo zip -sf -r backup.zip .
zip -sf -r backup.zip .
echo "with exclusions --------------------------------------------------"
declare -a Exclude=(ignore_dir_1/\* ignore_dir_2/\*)
echo zip -sf -r backup.zip . -x ${Exclude[@]}
zip -sf -r backup.zip . -x ${Exclude[@]}
echo 'double quoted ${Exclude[@]} --------------------------------------'
echo zip -sf -r backup.zip . -x "${Exclude[@]}"
zip -sf -r backup.zip . -x "${Exclude[@]}"
"테스트 실행" 전에 디렉토리 트리의 결과를 표시합니다.
$ ./script
directory tree ---------------------------------------------------
.
./dir_0
./dir_0/file-1
./dir_0/file-2
./ignore_dir_1
./ignore_dir_1/file-11
./ignore_dir_1/file-12
./ignore_dir_2
./ignore_dir_2/file name with spaces
./ignore_dir_2/file-22
./ignore_dir_2/file-21
./script
without exclusions -----------------------------------------------
zip -sf -r backup.zip .
Would Add/Update:
dir_0/
dir_0/file-1
dir_0/file-2
ignore_dir_1/
ignore_dir_1/file-11
ignore_dir_1/file-12
ignore_dir_2/
ignore_dir_2/file name with spaces
ignore_dir_2/file-22
ignore_dir_2/file-21
script
Total 11 entries (621 bytes)
with exclusions --------------------------------------------------
zip -sf -r backup.zip . -x ignore_dir_1/file-11 ignore_dir_1/file-12 ignore_dir_2/file-21 ignore_dir_2/file-22 ignore_dir_2/file name with spaces
Would Add/Update:
dir_0/
dir_0/file-1
dir_0/file-2
ignore_dir_1/
ignore_dir_2/
script
Total 6 entries (621 bytes)
double quoted ${Exclude[@]} --------------------------------------
zip -sf -r backup.zip . -x ignore_dir_1/* ignore_dir_2/*
Would Add/Update:
dir_0/
dir_0/file-1
dir_0/file-2
script
Total 4 entries (621 bytes)