Por que seu comando original não funciona?
bash$ mydate="--date=format:\"%Y-%m-%d T%H\""
bash$ git log "$mydate" # This works great.
bash$ git log $mydate
fatal: ambiguous argument 'T%H"': unknown revision or path not in the working tree.
Você pergunta:
Why do I need the double-quotes? What exactly is git-log seeing after the variable is dereferenced without double-quotes?
Se você não usar aspas duplas em torno de $mydate
, a variável será expandida textualmente e a linha do shell será a seguinte antes de ser executada:
git log --date=format:"%Y-%m-%d T%H"
^————————————^—————— literal quotes
Aqui, você (desnecessariamente) adicionou citações literais usando \"
na atribuição da variável.
Como o comando será submetido a divisão de palavras , git
receberá três argumentos, log
, --date-format:"%Y-%m%-d
e T%H"
, reclamando, portanto, sobre não encontrar nenhum commit ou objeto chamado T%H"
.
Qual é a abordagem correta?
Se você quiser manter os argumentos juntos, se esse argumento contiver espaço em branco, será necessário incluir o argumento entre aspas. Geralmente, sempre envolva variáveis entre aspas duplas.
Isso funciona mesmo se houver um espaço dentro da variável:
mydate="--date=format:%Y-%m-%d T%H"
git log "$mydate"
Agora, o terceiro argumento para git
será $mydate
, incluindo o espaço que você especificou originalmente. Todas as aspas são removidas pelo shell antes de serem passadas para git
.
Você simplesmente não precisa da citação adicional - se tudo que você quer é git
para ver um argumento, coloque esse argumento entre aspas ao passar a variável "$mydate"
.
Além disso, você pergunta:
bash$ nospace="--date=format:\"%Y-%m-%d\""
bash$ git log $nospace # Now THIS works great.
bash$ git log "$nospace" # This kind of works, here is a snippet:
# From git-log output:
Date: "2018-04-12"
Sua pergunta:
Yuck, why does the printed output have double-quotes in it now?
Porque você incluiu novamente literal aspas no argumento (escapando delas), que são transformadas em, digamos, aspas “reais” quando você esquece de citar a variável em seu comando real. Eu digo “esqueça” porque usar variáveis não-citadas em comandos de shell geralmente está causando problemas - e aqui está invertendo um erro que você fez ao especificar a variável em primeiro lugar.
PS: Eu sei que isso é confuso, mas isso é Bash, e segue algumas regras claras. Não há bug aqui. Um ensaio relacionado sobre nomes de arquivos no shell também é muito revelador, pois aborda a questão do espaço em branco manipulação no Bash.