Bash 스크립트의 7z는 디렉토리를 제외하지 않습니다.

Bash 스크립트의 7z는 디렉토리를 제외하지 않습니다.

7z(또는 bash, 아직 모르겠습니다)에서 다소 이상한 동작을 경험했습니다. 다음 스크립트를 사용하십시오.

#!/bin/bash
find /home/user  -type f -name "*.pdf" | cut -c 10- > /home/user/exclude_list2.lst;
lst1=" -x@/home/user/exclude_list2.lst -xr!'*.config/*' -xr!'*.cache/*' "
command=$(/usr/bin/7z a $lst1 -v2048M arch0.7z /home/user);
$command

또한 마지막 두 줄은 한 줄로 쉽게 바꿀 수 있습니다.

/usr/bin/7z a $lst1 -v2048M arch0.7z /home/user

나는 또한 다음을 시도했습니다.

command="/usr/bin/7z a  $lst1  -v2048M arch0.7z /home/dh ;"

"arch0.7z" 파일을 받았지만 .config 및 .cache 폴더는 다음과 함께 계속 포함되어 있습니다.

#!/bin/bash
find /home/user  -type f -name "*.pdf" | cut -c 10- > /home/user/exclude_list2.lst;
/usr/bin/7z a -x@/home/user/exclude_list2.lst -xr!'*.config/*' -xr!'*.cache/*' -v2048M arch0.7z /home/user ;"

올바르게 제외된 폴더가 포함된 파일을 생성합니다.

그래서 변수에서 확장된 줄의 차이점이 무엇인지 궁금합니다.

/usr/bin/7z a $lst1 -v2048M arch0.7z /home/user

제가 입력한 내용은 다음과 같습니다.

 /usr/bin/7z a -x@/home/user/exclude_list2.lst -xr!'*.config/*' -xr!'*.cache/*' -v2048M arch0.7z /home/user

7z 워크플로우에 이렇게 큰 변화가 생긴 이유가 있나요?

답변1

당신의 원래 형태

command=$(/usr/bin/7z a $lst1 -v2048M arch0.7z /home/user);
$command

$command포함한다는 의미일 것이다산출7zip 실행의 일부로 var=$(...)명령 출력이 변수에 저장됩니다.

그래서,

/usr/bin/7z a $lst1 -v2048M arch0.7z /home/user

교체는 아니고 스크립트 오류 수정입니다.

어쨌든, 진짜 문제를 직시해보자.

셸에서 변수 할당을 실행하면 다음 사항을 확인할 수 있습니다.

$ lst1=" -x@/home/user/exclude_list2.lst -xr!'*.config/*' -xr!'*.cache/*' "
-bash: !'*.config/*': event not found

"..."따라서 큰따옴표를 사용할 때 쉘이 변수 대체 등을 수행하기 때문에 이 행에는 오류가 있습니다 . 문제의 항목은 !bash가 이 항목을 사용하여 기록에서 이전 명령을 참조하기 때문입니다. 대신 작은따옴표를 사용하세요.'...'

$ lst1=' -x@/home/user/exclude_list2.lst -xr!'*.config/*' -xr!'*.cache/*' '
$ echo $lst1
-x@/home/user/exclude_list2.lst -xr!*.config/* -xr!*.cache/*

답변2

이건 내가 예상하지 못한 일이다.

lst1=' -xr@/home/me/exclude_list2.lst -xr!'*.config/*' -xr!'*.cache/*' -xr!'*.local/*' '
7z a $lst1 -v2048M arch0.7z /home/me

작은 따옴표를 생각할 때 트릭을 수행합니다.-xr! '.config/'실제로 인수의 일부인 변수 할당으로 끝날 것입니다. 또한 내 변수가 배열이면 훌륭하게 작동합니다.

그런데 "!"로 탈출한다. 작동하지 않습니다. 7z는 "오류: 잘못된 명령줄"이라는 메시지를 표시합니다.

관련 정보