Como posso fazer essa variável Bash funcionar: myformat = “- format = fuller --date = format:% Y-% m-% d T% H” [closed]

0

Esta é uma questão sobre como o Bash lida com agrupamento de palavras e expansão de variáveis. Eu demonstrarei a questão com um exemplo muito específico:

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.

Eu gostaria que isso funcionasse:

bash$ git log "$myformat"    # It should print the same stuff.

Eu não sei como fazer isso acontecer com apenas uma variável Bash. Aqui está um exemplo de trabalho com duas variáveis:

# 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.

O problema é este: como posso fazer isso funcionar com apenas uma variável Bash? É possível?

O problema principal:

git log --format=fuller --date=format:"%Y-%m-%d T%H"
                       |                       ^ This space is inside one argument.
                       |
                       ^ This space separates two arguments.

Eu gostaria de usar uma variável de string normal. Eu não quero usar uma variável de matriz, eu não quero usar $'...' , eu não quero usar uma função, eu não quero usar um alias. Quando a string é imutável, e quando não está no início do comando, parece que deveria ser uma variável de Bash.

Eu poderia facilmente resolver isso com uma função de uma maneira que seja bastante legível. Eu poderia resolvê-lo com outros truques de Bash de uma forma que seria horrível. Eu quero usar uma variável de string.

    
por SerMetAla 13.04.2018 / 10:52

2 respostas

1

I do not want to use an array variable

Você está rejeitando uma ferramenta adequada para o trabalho. Bem, você pode tentar com eval :

$> foo='a "b c"'
$> printf "%s\n" $foo
a
"b
c"
$> eval printf '"%s\n"' $foo
a
b c
$>

No seu caso, seria como:

myformat='--format=fuller --date=format:"%Y-%m-%d T%H"'
eval git log $myformat
    
por 13.04.2018 / 14:45
1

Este é um FAQ comum. link

Resumidamente, a maneira de resolvê-lo é colocar os argumentos em uma matriz.

myformat=("$mypref" "$mydate")
git log "${myformat[@]}"

Como solução alternativa muito simples, você também pode usar printf com o especificador de formato de cotação:

printf -v myformat '%q %q' "$mypref" "$mydate"
git log $myformat
    
por 13.04.2018 / 13:25