Ao executar
/usr/bin/borg info --last 1 --json ${repo} | jq -r '.archives | first | .end' | python3 -c "import arrow, sys ; print(arrow.get(sys.stdin.read()).isoformat())" > /etc/local/borg-lastrun-${repo}-${tobackup}.txt
eu recebo
/etc/local/borg.sh: line 27: /etc/local/borg-lastrun-${repo}-${tobackup}.txt: ambiguous redirect
( ${repo}
e ${tobackup}
estão definidos)
Onde está a ambiguidade?
Eu suspeito que este pode ser o jq
código ( '.archives | first | .end'
) por causa dos vários tubos fora e dentro das aspas (?) mas não tenho certeza (nem sei como corrigi-lo se for esse o caso)
No Bash, o valor de uma variável sem aspas (por exemplo,
${repo}
ou$repo
) sofre divisão de palavras e geração de nome de arquivo. Isso significa que, em geral, uma variável sem aspas pode gerar mais de uma palavra. Ou menos; se não estiver definido ou vazio, gerará zero palavras.No caso de um redirecionamento como
> ${repo}
ou> $repo
, qualquer quantidade de palavras, exceto uma, está errada. Tecnicamente, o seguinte pode ser válido (mas não é):Se fosse válido , então a última linha seria equivalente a
que é válido e equivalente a
Esconder um argumento (aqui:
baz
) dentro do que parece ser um redirecionamento (aqui:> $foo
) seria uma prática ruim se feito deliberadamente, ou um bug potencialmente prejudicial se feito inadvertidamente. Bash não permite que você faça isso.(Na verdade, suspeito que não seja porque o Bash se importa, mas por causa de como seu analisador funciona: acho que reconhece redirecionamentos cedo, separa-os do comando real e processa como um pouco desconectado. Injetar um argumento de volta no comando seria problemático e não vale a pena. Mas este é o meu palpite .)
O manual afirma explicitamente [ênfase minha]:
Este é o erro de "redirecionamento ambíguo" que você recebeu. O manual diz "mais de uma palavra"; os testes indicam que o mesmo erro ocorre no caso de "zero palavras" (a variável vazia ou não definida).
O número certo de palavras é um. Isso também se aplica quando há muitas variáveis envolvidas, como no seu arquivo
/etc/local/borg-lastrun-${repo}-${tobackup}.txt
. Esta string não pode expandir para zero palavras, mas (dependendo dos valores das variáveis) pode expandir para mais de uma palavra. Uma maneira correta de garantir que a string seja interpretada como uma única palavra é aspas duplas:Aspas duplas são quase sempre a coisa certa a se fazer também em outras partes do código, onde quer que você use variáveis . Existem situações em que você pode omitir aspas . Situações em que você não deve citar são relativamente raras.
As aspas simples são outra maneira de evitar a divisão de palavras, mas como também impede a expansão de variáveis (na verdade: qualquer expansão), não é útil em nosso caso.