Comment puis-je diviser une commande sur plusieurs lignes dans le shell, lorsque la commande fait partie d'un if
instruction?
Cela marche:
if ! fab --fabfile=.deploy/fabfile.py --forward-agent --disable-known-hosts deploy:$target; then rc=1
fi
Cela ne fonctionne pas:
# does not work:
if ! fab --fabfile=.deploy/fabfile.py \
--forward-agent \
--disable-known-hosts deploy:$target; then
rc=1
fi
Au lieu d'exécuter toute la commande, j'obtiens:
./script.sh: line 73: --forward-agent: command not found
Plus important encore, qu'est-ce qui manque à ma compréhension de Bash qui m'aidera à comprendre ce problème et des problèmes similaires à l'avenir?
$ if ! cp -n log/server1.log \ > .; then echo no copy; fi
sans erreur, avec une nouvelle ligne après\
\
? Ils sont assez difficiles à voir. Si vous le faites, vous voudrez peut-être voir si vous pouvez faire en sorte que votre éditeur supprime les espaces de fin ou les rende plus visibles.Réponses:
La suite de ligne échouera si vous avez des espaces (espaces ou tabulations) après la barre oblique inverse et avant la nouvelle ligne. Sans un tel espace, votre exemple fonctionne bien pour moi:
Quelques détails promus dans les commentaires: la barre oblique inverse de continuation de ligne dans le shell n'est pas vraiment un cas spécial; c'est simplement un exemple de la règle générale selon laquelle une barre oblique inverse "cite" le caractère immédiatement suivant, empêchant tout traitement spécial auquel elle serait normalement soumise. Dans ce cas, le caractère suivant est une nouvelle ligne et le traitement spécial empêché met fin à la commande. Normalement, un caractère cité se retrouve inclus littéralement dans la commande; un retour à la ligne annulé est à la place entièrement supprimé. Mais sinon, le mécanisme est le même. Et la barre oblique inverse ne cite que le caractère immédiatement suivant; si ce caractère est un espace ou une tabulation, vous obtenez simplement un espace ou une tabulation entre guillemets, et toute nouvelle ligne subséquente reste sans guillemets.
la source
`s. For example, when adding one after the first
`, j'obtiens./soundops: line 73: --forward-agent: command not found
. Mon problème était que je ne comprenais pas cette erreur. Pourquoi avoir un espace blanc entraîne-t-il cette erreur? Le blanc +\n
"annule" le `` et délimite une commande?Pour les utilisateurs de Windows / WSL / Cygwin, etc.:
Assurez-vous que vos fins de ligne sont des sauts de ligne Unix standard, c'est-à-dire
\n
(LF) uniquement.L'utilisation de fins de ligne Windows
\r\n
(CRLF) interrompra la rupture de la ligne de commande.En effet, avoir
\
à la fin d'une ligne avec une fin de ligne Windows se traduit par\
\r
\n
.Comme Mark l'explique correctement ci-dessus:
Cela inclut non seulement l'espace (
) ou les tabulations (
\t
) mais également le retour chariot (\r
).la source