La préservation de devis en bash les paramètres de la fonction

Ce que je voudrais faire est de prendre comme entrée d'une fonction, d'une ligne qui peut inclure des guillemets (simples ou doubles) et l'écho de cette ligne exactement comme c'était prévu à la fonction. Par exemple:

function doit {
   printf "%s " ${@} 
   eval "${@}"
   printf " # [%3d]\n" ${?}
}

Qui, compte tenu de la manière suivante

doit VAR=42
doit echo 'single quote $VAR'
doit echo "double quote $VAR"

Les rendements suivants:

VAR=42  # [  0]
echo single quote $VAR  # [  0]
echo double quote 42  # [  0]

Si la sémantique de l'expansion des variables sont conservées en tant que je m'attends, mais je ne peux pas obtenir le format exact de la ligne, comme c'était prévu à la fonction. Ce que j'aimerais c'est avoir doit echo 'single quote $VAR' résultat dans echo 'single quote $VAR'.

Je suis sûr que cela a à voir avec bash de traiter les arguments avant qu'ils sont passés à la fonction; je suis à la recherche d'un moyen de contourner cela (si possible).

Modifier

Donc ce que j'avais prévu était de l'ombre à l'exécution d'un script, tout en fournissant une réplique exacte de l'exécution qui peut être utilisé comme un outil de diagnostic, y compris la sortie de l'état de chaque étape.

Alors que je peut obtenir le comportement souhaité décrit ci-dessus en faisant quelque chose comme

while read line ; do 
   doit ${line}
done < ${INPUT}

Cette approche échoue face à des structures de contrôle (c'est à dire if, while, etc). J'ai pensé à utiliser set -x mais qui a ses limites: " devient ' et de statut de sortie n'est pas visible pour les commandes qui ne.

OriginalL'auteur ezpz | 2010-07-15