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

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

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

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-$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

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

인수를 공백으로 분할하기 위해 변수를 사용할 때 따옴표가 없습니다.

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

관련 정보