Bash가 단어 그룹화 및 변수 확장을 어떻게 처리하는지에 대한 질문입니다. 나는 매우 구체적인 예를 들어 질문을 보여 드리겠습니다.
bash$ git log --format=fuller --date=format:"%Y-%m-%d T%H" # This works.
# Sample output:
commit aba22155684
Author: SerMetAla
AuthorDate: 2018-04-12 T23
Commit: SerMetAla
CommitDate: 2018-04-12 T23
Here is the commit message.
나는 이것이 작동하기를 원합니다 :
bash$ git log "$myformat" # It should print the same stuff.
하나의 Bash 변수만으로 이를 실현하는 방법을 모르겠습니다. 다음은 두 개의 변수를 사용한 작업 예입니다.
# Define the two variables:
bash$ mypref="--format=fuller"
bash$ mydate="--date=format:%Y-%m-%d T%H" # Note: No " after the colon.
# Now use it:
bash$ git log "$mypref" "$mydate" # It works.
문제는 이것이다: 단 하나의 Bash 변수로 어떻게 이 작업을 수행할 수 있는가? 가능합니까?
주요 문제:
git log --format=fuller --date=format:"%Y-%m-%d T%H"
| ^ This space is inside one argument.
|
^ This space separates two arguments.
일반 문자열 변수를 사용하고 싶습니다. 배열 변수를 사용하고 싶지 않고, 을 사용하고 싶지 않고 $'...'
, 함수를 사용하고 싶지 않고, 별칭을 사용하고 싶지 않습니다. 문자열이 변경 불가능하고 명령 시작 부분에 없으면 Bash 변수여야 하는 것처럼 느껴집니다.
상당히 읽기 쉬운 방식으로 함수를 사용하면 이 문제를 매우 쉽게 해결할 수 있습니다. 끔찍한 방식으로 다른 Bash 트릭을 사용하여 문제를 해결할 수 있습니다. 문자열 변수를 사용하고 싶습니다.
답변1
배열 변수를 사용하고 싶지 않습니다.
작업에 적합한 도구를 거부하고 있습니다. 음, 다음을 시도해 볼 수 있습니다 eval
.
$> foo='a "b c"'
$> printf "%s\n" $foo
a
"b
c"
$> eval printf '"%s\n"' $foo
a
b c
$>
귀하의 경우에는 다음과 같습니다:
myformat='--format=fuller --date=format:"%Y-%m-%d T%H"'
eval git log $myformat
답변2
일반적인 FAQ입니다.https://mywiki.wooledge.org/BashFAQ/050
간단히 말해서, 이를 해결하는 방법은 인수를 배열에 넣는 것입니다.
myformat=("$mypref" "$mydate")
git log "${myformat[@]}"
printf
매우 조잡한 해결 방법으로 인용 형식 지정자와 함께 사용할 수도 있습니다 .
printf -v myformat '%q %q' "$mypref" "$mydate"
git log $myformat