Digite a primeira linha no bash e, em seguida, repita essa variável. É isso que você verá:
$ tmpdir=/cygdrive/c/workdir\ \(newco\,\ LLC\)
$ echo $tmpdir
/cygdrive/c/workdir (newco, LLC)
Se ainda não está claro qual é o culpado, adicione echo
no início de sua segunda linha e coloque-o entre aspas duplas. Você verá o comando que é realmente executado:
$ echo "tail -n +2 $tmpdir/workfile.txt > $tmpdir/workfile2.txt"
tail -n +2 /cygdrive/c/workdir (newco, LLC)/workfile.txt > /cygdrive/c/workdir (newco, LLC)/workfile2.txt
Você escapou adequadamente da atribuição de variáveis, mas isso não é suficiente. O Bash executa uma substituição de subcadeia simples, inserindo espaços adicionais e quebrando seu comando.
Como sugerido por @savanto em sua resposta, você pode agrupar variáveis entre aspas duplas para garantir que espaços extras não sejam tratados como separadores de argumentos. Esta linha:
tail -n +2 "${tmpdir}/workfile.txt" > "${tmpdir}/workfile2.txt"
ficará assim após a substituição da variável:
tail -n +2 "/cygdrive/c/workdir (newco, LLC)/workfile.txt" > "/cygdrive/c/workdir (newco, LLC)/workfile2.txt"
Esta é a maneira mais comum e preferida de resolver esse problema. Se você deseja desesperadamente evitar aspas duplas, pode tentar escapar em dobro: primeiro ao atribuir, depois da substituição.
$ tmpdir=/cygdrive/c/workdir\\ \\(newco\\,\\ LLC\\)
$ echo $tmpdir
/cygdrive/c/workdir\ \(newco\,\ LLC\)
Explicação rápida de barras invertidas triplas: uma barra invertida significa: "trate o próximo caractere como um caractere regular, ignore qualquer significado especial" (por exemplo, escape dele ). A primeira barra invertida é um caractere de escape, então o segundo será tratado como um caractere de barra invertida, e não um caractere de escape. Assim, a barra invertida dupla produz uma única barra invertida. O terceiro simplesmente escapa do seguinte caractere, como espaço ou parênteses. Por exemplo, a\\ b
se tornará a\ b
.
Agora, se substituirmos as variáveis em seu comando, ele será escapado corretamente:
tail -n +2 /cygdrive/c/workdir\ \(newco\,\ LLC\)/workfile.txt > /cygdrive/c/workdir\ \(newco\,\ LLC\)/workfile2.txt