여러 명령에 유사한 플래그 재사용

여러 명령에 유사한 플래그 재사용

비슷한 플래그를 사용하여 여러 명령을 실행하고 싶다고 가정해 보겠습니다. 예를 들면 다음과 같습니다.

du -sh / --exclude=/dir1 --exclude=/dir2 --exclude=/dir3/dir4
tar cvf archive / --exclude=dir1 --exclude=dir2 --exclude=dir3/dir4

--exclude일련의 플래그를 재사용 하고 이러한 플래그를 변수에 저장하는 것처럼 코드를 더 깔끔하게 만들고 싶습니다 .

그 후 위의 명령은 다음과 같습니다

du -sh / "$EFLAGS"
tar cvf archive / "$EFLAGS"

해당 tar디렉터리와 관련된 파일 및 디렉터리는 제외됩니다.

가장 좋고 깨끗한 솔루션은 무엇입니까?

배경

tar를 사용하여 시스템을 백업하고 필요하지 않은 일부 디렉토리를 제외하고 싶습니다.

답변1

다음을 시도해 볼 수 있습니다.

$ echo -e / --exclude=/dir1 --exclude=/dir2 --exclude=/dir3/dir4
/ --exclude=/dir1 --exclude=/dir2 --exclude=/dir3/dir4
$ echo !!:3-$
echo --exclude=/dir1 --exclude=/dir2 --exclude=/dir3/dir4
--exclude=/dir1 --exclude=/dir2 --exclude=/dir3/dir4

bash여기서는 히스토리 확장을 사용합니다 .

  • !!마지막 명령을 참조하세요
  • 3-$세 번째 매개변수부터 마지막 ​​매개변수까지 참조하세요.

bash비대화형 쉘에서는 비활성화된 기록 확장 기능을 스크립트에서 활성화해야 합니다.

set -o history
set -o histexpand

답변2

Bash에서 매우 깔끔한 방법은 배열을 사용하는 것입니다.

myflags=( --exclude=/dir1 --exclude=/dir2 --exclude=/dir3/dir4 )
tar cvf archive / "${myflags[@]}"

공백 및 기타 흥미로운 문자를 처리할 수 있습니다.

myflags=( "--exclude=/a dir/with spaces" $'--exclude=/a dir/with\nnewlines' )
tar cvf archive / "${myflags[@]}"

/this/one예를 들어 디렉터리에 문자가 포함된 모든 하위 디렉터리를 제외하려는 경우에는 위조할 수도 있습니다 g.

exclude_dirs=( /this/one/*g* )
myflags=( "${exclude_dirs[@]/#/--exclude=}" )
tar cvf archive / "${myflags[@]}"

답변3

이것을 댓글로 추가하고 싶었지만 아직 댓글 형식을 멋지게 지정하는 방법을 찾지 못했습니다.

어쨌든 나는 당신이 90% 성공했다고 믿습니다. 노력하다:-

EFLAGS="--exclude=/dir1 --exclude=/dir2"
du -sh / $EFLAGS
tar cvf archive / $EFLAGS

첫 번째 줄에는 공백이 포함되어 있으므로 따옴표가 필요합니다.

공백으로 인수를 분할하려면 따옴표 없이 변수를 사용하세요.

제외된 디렉터리 이름에 공백이 있으면 이스케이프해야 합니다.

관련 정보