Digita la prima riga in bash e poi echo quella variabile, questo è ciò che vedrai:
$ tmpdir=/cygdrive/c/workdir\ \(newco\,\ LLC\)
$ echo $tmpdir
/cygdrive/c/workdir (newco, LLC)
Se non è ancora chiaro quale sia il colpevole, aggiungi echo all'inizio della seconda riga e avvolgila tra virgolette. Vedrai quale comando viene effettivamente eseguito:
$ 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
Hai assegnato correttamente l'assegnazione della variabile, ma non è abbastanza. Bash esegue una semplice sostituzione della sottostringa, inserendo quindi spazi aggiuntivi e interrompendo il comando.
Come suggerito da @savanto nella sua risposta, è possibile racchiudere le variabili tra virgolette per garantire che gli spazi aggiuntivi non vengano trattati come separatori di argomenti. Questa linea:
tail -n +2 "${tmpdir}/workfile.txt" > "${tmpdir}/workfile2.txt"
sarà simile a questo dopo la sostituzione della variabile:
tail -n +2 "/cygdrive/c/workdir (newco, LLC)/workfile.txt" > "/cygdrive/c/workdir (newco, LLC)/workfile2.txt"
Questo è il modo più comune e preferito per risolvere questo problema. Se vuoi disperatamente evitare le virgolette doppie, puoi provare a eseguire il doppio escape: prima durante l'assegnazione, poi dopo la sostituzione.
$ tmpdir=/cygdrive/c/workdir\\\ \\\(newco\\\,\\\ LLC\\\)
$ echo $tmpdir
/cygdrive/c/workdir\ \(newco\,\ LLC\)
Spiegazione rapida delle triple backslash: un backslash significa: "considera il prossimo carattere come un personaggio normale, ignora qualsiasi significato speciale" (ad es. sfuggirlo ). Il primo backslash è un carattere di escape, quindi il secondo sarà trattato come un carattere backslash, non come un carattere di escape. Pertanto, il doppio backslash produce un singolo backslash. Il terzo sfugge semplicemente al carattere successivo, come spazio o parentesi. Per esempio a\\\ b diventerà a\ b.
Ora, se sostituiamo le variabili nel tuo comando, sarà evaso correttamente:
tail -n +2 /cygdrive/c/workdir\ \(newco\,\ LLC\)/workfile.txt > /cygdrive/c/workdir\ \(newco\,\ LLC\)/workfile2.txt