Cela utilise bash arrays - mais je vois dans les commentaires à une autre réponse que le code n'est pas censé s'exécuter sous bash (malgré la balise bash appliquée à l'origine à la question); il est destiné à fonctionner sous le shell busybox.
Je suis presque certain qu'il ne répond pas à la question parce que la question est pratiquement impossible à répondre étant donné les limites de busybox. Par le passé, j'ai utilisé un programme personnalisé que j'ai appelé 'escape' pour construire une chaîne d'arguments qui peut être évaluée pour obtenir les arguments originaux - espaces et tout. Mais cela nécessite un soutien de l'extérieur du shell.
Cette solution utilise uniquement 'bash'. Je ne suis pas sûr que ce code soit entièrement idiomatique, mais cela fonctionne.
#!/bin/bash
i=0
Qflag=0
for arg in "[email protected]"
do
if [ "X$arg" = "X-Q" ]
then Qflag=1
else args[$((i++))]=$arg
fi
done
if [ $Qflag = 1 ]
then exec acommand "${args[@]}" 2>&1 >/dev/null
else exec acommand "${args[@]}"
fi
Les premières boucles construit un tableau, args, avec les arguments du script, sauf qu'il n'ajoute « -Q » à la liste et enregistre sa présence dans qflag variable. L'instruction if à la fin indique si Qflag a été mis à 1 et, si c'est le cas, envoie les erreurs de 'acommand' à la sortie standard et envoie la sortie standard standard à/dev/null (ce qui est différent de l'effet si les redirections d'E/S sont inversées - cela enverrait la sortie standard à/dev/null et enverrait l'erreur standard au même endroit, forçant le silence sur 'acommand').
L'utilisation de 'exec' est une optimisation triviale qui simplifie le traitement de l'état de sortie dans ce cas.
Testé avec 'acommand' qui imprime ses arguments sur des lignes distinctes:
#!/bin/sh
for arg in "[email protected]"
do echo "$arg"
done
et avec des lignes de commande tels que:
bash wrapper.sh -c -d 'arg with spaces'
qui produit la sortie:
-c
-d
arg with spaces
Évidemment, avec la redirection d'E/S en place, il n'y a pas de sortie de:Toutefois, si vous omettez la redirection d'E/S, vous obtenez la même sortie.
Si vous voulez exécuter le script shell avec busybox, pourquoi cela est étiqueté 'bash'? Et pourquoi voulez-vous utiliser busybox shell quand bash fournit les fonctionnalités dont vous avez besoin? –
Vous avez raison. Pardon. –