다음 매개변수를 사용하는 rsync 명령이 있습니다.
rsync -avz --{partial,stats,delete,exclude=".*"}
해당 매개변수를 변수에 넣어 스크립트에서 재사용할 수 있도록 하고 싶습니다. 이 같은:
#!/bin/bash
VAR=rsync -avz --{partial,stats,delete,exclude=".*"}
$VAR /dir1 /dir2
따옴표, 작은 따옴표, 대괄호를 사용해 보았지만 성공하지 못했습니다.
답변1
복잡한 명령을 변수에 넣는 것은 결코 권장되는 접근 방식이 아닙니다. 바라보다BashFAQ/050 - 명령을 변수에 넣으려고 하는데 복잡한 경우에는 항상 실패합니다!
변수 대신 함수를 사용하고 함수에 매개변수를 전달하기로 결정했다면 요구사항은 매우 간단해집니다.
그것은 마치
rsync_custom() {
[ "$#" -eq 0 ] && { printf 'no arguments supplied' >&2; exit 1 ; }
rsync -avz --{partial,stats,delete,exclude=".*"} "$@"
}
이제 필수 매개변수를 전달하세요.
rsync_custom /dir1 /dir2
함수 정의는 어떤 면에서는 매우 간단합니다. 먼저 $#
0이 되어서는 안 되는 변수를 사용하여 입력 매개변수 개수를 확인합니다. 인수가 제공되지 않았다는 오류 메시지가 표시됩니다. 유효한 인수가 있으면 "$@"
함수에 제공된 실제 인수를 나타냅니다.
이것이 자주 사용하는 함수인 경우(예: 스크립트/명령줄에서) 이를 쉘 시작 파일에 추가하세요( .bashrc
예: .bash_profile
.
또는 언급한 대로 가독성을 높이기 위해 중괄호 확장을 별도의 인수로 확장하는 것이 가치가 있을 수 있습니다.
rsync_custom() {
[ "$#" -eq 0 ] && { printf 'no arguments supplied' >&2; exit 1 ; }
rsync -avz --partial --stats --delete --exclude=".*" "$@"
}
답변2
VAR=rsync -avz --{partial,stats,delete,exclude=".*"}
-avz
이는 매개변수 등을 사용하여 명령을 실행 --partial
하고 환경에 설정하려고 시도합니다.--stats
VAR
rsync
VAR='rsync -avz --{partial,stats,delete,exclude=".*"}'
중괄호는 따옴표 내에서 확장되지 않고 할당 내부에서도 확장되지 않으며 변수 확장 후에도 확장되지 않기 때문에 인용된 형식은 작동하지 않습니다.
변수에 명령줄 인수를 저장해야 하는 경우 배열을 사용하세요.
args=(rsync -avz --{partial,stats,delete,exclude=".*"})
이제 , 등 을 다른 단어로 "${args[@]}"
확장해 보세요 .rsync
-avz
--partial
배열을 사용하면 필요에 따라 목록에 옵션을 추가할 수도 있습니다. 예를 들면 다음과 같습니다.
args=(this that)
if something ; then
args+=(another_arg)
fi
"$cmd" "${args[@]}"
또한보십시오:
답변3
최소한 일부 옵션을 변수에 저장할 수 있습니다.
opts=$(echo --{ignore-case,word-regexp,count,exclude="sys*.*"})
차폐가 어려울 수 있으므로 테스트가 중요합니다.
echo $opts
--ignore-case --word-regexp --count --exclude="sys*.*"
grep $opts bytes *.log
히스토리 사용, 별칭 사용, 함수 사용 등 여러 옵션이 있으므로 명확한 사용 사례가 생각나지 않습니다. 복잡한 옵션은 서로 다른 프로그램 간에 공유되는 경우가 거의 없으므로 대화형 셸에 대한 임시 솔루션의 경우 별칭이 더 나은 접근 방식인 것 같습니다.
alias cgrep='grep --ignore-case --word-regexp --count --exclude="sys*"'
cgrep bytes *.log
귀하의 샘플
VAR=rsync -avz --{partial,stats,delete,exclude=".*"}
작업이 첫 번째 공백에서 끝나기 때문에 작동하지 않습니다. 공백을 가려야 합니다.
VAR='rsync -avz --{partial,stats,delete,exclude=".*"}'
--delete 옵션으로 테스트하는 것은 매우 위험하지 않습니까? 옵션에 다시 "," 및 작은따옴표가 포함될 수 있으므로 마스킹이 빠르게 어려워집니다. 별칭이나 종속성 기록을 선택하겠습니다.
여러 세션에서 지속적으로 사용할 수 있도록 별칭을 ~/.bashrc 파일에 저장할 수 있습니다. 함수는 bashrc에 저장할 수도 있지만 인수를 처리하려면 함수에 전달하여 거기에서 평가되기만 하면 됩니다.