2017-09-22 4 views
0

Je crée un script shell qui prend une entrée standard en option. J'ai un extrait du code ci-dessous. $ {file} est juste un nom de fichier qui est écrit dans un fichier txt contenant une liste de tous les noms de fichiers. $ 2 dans ce cas serait un autre programme (un script shell aussi).Problèmes avec le caractère spécial '<' dans la chaîne Bash?

 if [ -f ${file}.in ]; then #if ${file}.in exists in current directory 

       stdIn="< ${file}.in" #set optional stdIn 

     fi 
     if ! [ -f ${file}.args ]; then #if ${file}.args does not exist in curr directory 

       $2 $stdIn > ${file}.out #run the $2 program with the optional standard input and redirect the output to a .out file 

Pour une raison quelconque, le caractère '<' n'est pas interprété correctement. Cela fonctionne bien si je changeais la ligne à

$2 < $stdIn > ${file}.out 

et enlevé le « < » de la variable StdIn. Mais je ne veux pas faire cela parce que je vais devoir apporter des changements majeurs au reste de mon code. Quelqu'un sait quoi et comment résoudre le problème avec mon code actuel? Merci beaucoup.

+1

S'il vous plaît lire http://mywiki.wooledge.org/BashFAQ/050 et http://mywiki.wooledge.org/BashParser, le problème est que la redirection se produit avant l'expansion variable de sorte que le '<' est juste un autre personnage, pas spécial. –

Répondre

2

Vous ne pouvez pas stocker l'opérateur < dans une variable. Au lieu de cela, la bonne chose à faire est de rediriger inconditionnellement l'entrée du nom de fichier stocké dans stdIn, et l'initialiser à /dev/stdin afin que vous lisiez simplement depuis l'entrée standard si aucun autre fichier d'entrée n'est approprié.

stdIn=/dev/stdin 

if [ -f "${file}.in" ]; then 
    stdIn="${file}.in" #set optional stdIn 
fi 
if ! [ -f "${file}.args" ]; then 
    "$2" < "$stdIn" > "${file}.out" 
fi