2017-08-13 4 views
1

J'ai un fichier texte composé de commandes différentes:bash - command not found lors de l'analyse d'un fichier texte avec les commandes

set +e; false; echo $? 
(false;   echo foo); echo \ $? 
for i in .; do (false; echo foo); echo \ 1:$?; done; echo \ 2:$? 

et ainsi de suite.

Je souhaite tester ces commandes ligne par ligne, dans son ensemble, dans un processus bash enfant en utilisant set -e, puis vérifiez le code d'erreur du processus bash parent pour voir si l'enfant a quitté avec une erreur. Je suis bloqué sur la façon de traiter les commandes les plus simples (par exemple le premier listé ci-dessus). Voici une de mes tentatives récentes:

mapfile file < "$dir"/errorData 
bash -c "${file[0]}" 
echo $? 

retours

bash: set +e: command not found 
bash: false: command not found 
bash: echo 127: command not found 

J'ai essayé plusieurs variantes sans chance. L'utilisation de bash -c \'"${file[1]}"\' conduit à un message d'erreur sur la commande introuvable, avec les trois chaînes ci-dessus combinées en une longue chaîne. Bien sûr, simplement encapsuler les commandes de fichiers dans des guillemets forts et les envoyer directement à bash dans un shell interactif fonctionne très bien.

Edit: J'utilise bash 4.4.12 (1)

+0

Je ne peux pas reproduire ces erreurs sur Bash v4.3.48. Tout fonctionne bien. – randomir

+0

Etes-vous sûr de vouloir exécuter (-c) "$ {file [0]}", ou voulez-vous l'indiquer plutôt avec. "$ {fichier [0]}"? – yacc

+0

@yacc Sans -c, la commande échoue car bash attend un fichier ou un répertoire. – LumpyGrads

Répondre

1

Pour toute personne qui trouve que la coquille est l'analyse de leur texte d'une manière qui semble violer le manuel de référence, assurez-vous de vérifier toutes les données d'entrée copié pour les caractères de contrôle invisibles. Par exemple. J'ai trouvé un espace insécable à la place de ce qui ressemblait à un simple espace blanc, dans le fichier d'entrée avec les commandes à exécuter. Ceci est particulièrement courant lors de la copie de pages Web vers un éditeur ou la ligne de commande. bash utilise les espaces, les tabulations et les retours à la ligne pour symboliser, pas l'espace insécable (U + 0020 dans la norme Unicode). Un éditeur hexadécimal, par ex. hexfiend, peut aider à résoudre les problèmes similaires.

+0

Vos données collées ne contiennent aucun espace insécable (U + 0020 est un espace normal, U + 00A0 est un espace insécable). C'est une des nombreuses raisons pour lesquelles c'est une bonne idée de toujours copier votre cas de test dans un nouveau répertoire et de l'exécuter. –

+0

J'ai tapé les données que vous voyez ici, parce que c'était juste un échantillon de plusieurs douzaines de lignes. J'ai collé les données réelles que j'utilisais. – LumpyGrads