8
votes

La commande "lire" dans le script bash est ignorée

Je crée un script pour mettre à jour ma distribution Linux si j'ai besoin d'essuyer la HD ou que j'ai besoin d'installer Linux sur une autre machine. Donc, ce script installe essentiellement tous les programmes que j'ai généralement besoin. Au début, a une commande "lecture" qui demande si je souhaite installer tous les packages automatiquement ou non. Si je choisis non, pour chaque programme non trouvé, il devrait me demander que je veux qu'il soit installé et que j'utilise ce code xxx

mais si j'exécute le script, il saute la commande "Lecture" Dans la clause d'enrête et l'assume "n" ...

Je ne peux pas comprendre pourquoi, il existe une autre fonction de lecture également à l'intérieur si ... alors ... ..fi boucles et ils fonctionnent comme prévu ...

Des idées?


6 commentaires

Il est difficile de dire parce que cela ressemble à votre indentation s'est trompé horriblement dans la publication, mais il semble manquer une finale fi . En outre, le lisez fonctionne pour moi.


En outre, quel est le shebang en haut de votre script? #! / bin / bash ou autre? Et, juste pour être sûr, vous sont en cours d'exécution à partir d'une ligne de commande dans une session de terminal, oui? Si vous le faites crontab., Le script lira un «comme le résultat et continuera. Bonne chance.


@ jw013 Eh bien, peut-être qu'il a été coupé pendant que je l'ai copié / collé, mais les FIS sont corrects, sinon le script augmenterait une erreur


@shellter c'est #! / bin / bash oui. Et oui, j'exécute le script de la ligne de commande à l'aide de ./ script.sh


@Vieler: Vous avez oublié de demander, voyez-vous les messages au-dessus du lire mais à l'intérieur du sinon ? (On dirait que vous savez ce que vous faites, désolé d'avoir demandé ce qui est probablement trop évident une question); Bonne chance!


@shellter ne vous inquiétez pas, en fait, je ne suis pas si bon dans les scripts Bash, c'est plutôt nouveau pour moi. Quoi qu'il en soit, oui, les commandes Echo fonctionnent bien et je vois les cordes imprimées sur stdout.


3 Réponses :


8
votes

Essayez de lire à partir du terminal de contrôle:

read secondyn </dev/tty


0 commentaires

1
votes
read secondyn < /proc/${PPID}/fd/0
That will look to the parent's input, which should still be stdin.

0 commentaires

15
votes

Les parties pertinentes du code ne sont toujours pas complètes, mais elles sont basées sur les commentaires que je vais deviner que votre boucle tandis que vous ressemblez à xxx pré>

à partir de ce problème est immédiatement apparent: la Inner Lire Code> Obtenez son entrée du même endroit que la boucle extérieure, à savoir STDIN qui a été redirigé depuis fichier code>, et non l'utilisateur. Pour une alternative légèrement plus portable qui ne dépend pas de la prise en charge au niveau du noyau pour / dev / tty code>, utilisez simplement un descripteur de fichier différent autre que STDIN pour la boucle tandis. P>

while read -r ... <&9; do
    # loop stuff

    # stdin still attached to the terminal untouched, 
    # so this reads from the terminal as expected
    read -r var 

done 9< file


1 commentaires

Oui, c'était le problème. Je suppose que cette solution est meilleure pour la portabilité, donc merci de me mettre sur la bonne voie.