Bash cité de la matrice de l'expansion

Quand j'écris un bash programme que j'ai généralement de construire des appels comme suit:

declare -a mycmd=( command.ext "arg1 with space" arg2 thing etc )

"${mycmd[@]}" || echo "Failed: foo"

die foo est un bash fonction qui imprime Error foo et les sorties.

Mais si je veux être clair sur l'erreur de la raison, je veux imprimer la commande a échoué:

"${mycmd[@]}" || echo "Failed: foo: ${mycmd[*]}"

De sorte que l'utilisateur peut exécuter la mort de commande et de trouver pourquoi. Toutefois, la citation est perdu sur ce passe - le message d'Échec, les arguments contenant des espaces ou des caractères d'échappement ne sont pas imprimés dans une manière qui peut être cut-n-collé et de l'exécuter.

Quelqu'un aurait-il une suggestion pour un compact moyen de corriger ce problème?


Je pense que le problème est la façon dont bash traite avec l'argument d'analyse pour les commandes, et la manière (builtin) echo traite les arguments. Une autre façon de poser le problème est:

Comment puis-je impression les guillemets autour des arguments avec des espaces dans le bash suivant l'exemple (qui doit être exécuté comme un script, pas en mode immédiat):

#!/bin/bash
mkdir qatest; cd qatest
declare -a myargs=(1 2 "3 4")
touch "${myargs[@]}"
ls
echo "${myargs[@]}"

résultat réel:

1  2  3 4
1 2 3 4

résultat souhaité

1  2  3 4
1 2 "3 4"

OU

1  2  3 4
"1" "2" "3 4"

Dans quelques bash caractères de code.


Question fermée: @camh répondu magnifiquement:

script de mise à jour:

#!/bin/bash
mkdir qatest; cd qatest
declare -a myargs=(1 2 "3 4")
touch "${myargs[@]}"
ls
echo "${myargs[@]}"
echo $(printf "'%s' " "${myargs[@]}")

de sortie:

1  2  3 4
1 2 3 4
'1' '2' '3 4'

OriginalL'auteur Alex Brown | 2012-10-20