이 Bash 변수를 작동하게 하려면 어떻게 해야 합니까? myformat="--format=fuller --date=format:%Y-%m-%d T%H"

이 Bash 변수를 작동하게 하려면 어떻게 해야 합니까? myformat="--format=fuller --date=format:%Y-%m-%d T%H"

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

관련 정보