Loption -s de bash ne semble pas vraiment faire quoi que ce soit
Quand jexécute des commandes avec ou sans cela, rien ne change. Ce qui me trouble vraiment, cest que lorsque jexécute un script shell, il me semble toujours avoir un shell interactif. Je suppose que cest interactif car lorsque jutilise la lecture intégrée dans le script, il me demandera toujours Est-ce que cela le rend interactif?
Le script shell sexécute-t-il comme interactif dans fedora, et y a-t-il des exemples dune différence que -s peut faire? Jai lu les pages de manuel, mais je ne peux pas « t semblent générer moi-même des exemples qui auraient un effet quelconque. Jai combiné les deux questions parce que jessayais dutiliser s pour changer la façon dont le script recevait lentrée, et dans certains tutoriels, ils disent que cela a un effet. Je me rends compte quil peut définir des arguments, ce que je ne comprends pas, cest comment il le change pour le lire à partir dune entrée standard, il semble toujours le faire de toute façon
Voici ce que jai utilisé pour le tester
if [ -v $PS1 ] then echo non-interactive else echo interactive fi read ; echo $REPLY
read a toujours pu fonctionner dans des shells non et interactifs
Même lorsque jai testé la présence de fd / 0 et fd / 1 dans shells non interactifs, ils existaient encore
Merci davance
Réponse
Bash déterminera également si ou non, il est interactif en examinant si ses entrées / sorties sont attachées à un terminal.
Le commutateur non interactif -s
permet au script bash de traiter les paramètres de position lorsque lire les commandes dun fichier. Exemple:
$ cat demo.sh echo "$0 = " $0 echo "$1 = " $1 echo "$2 = " $2 $ bash < demo.sh foo bar bash: foo: No such file or directory $ bash -s < demo.sh foo bar $0 = bash $1 = foo $2 = bar
Réponse
Le -s
oblige bash à lire les commandes à partir de son entrée standard. Sans cette option, bash traite son premier argument comme le nom dun script à exécuter. Avec ceci option, bash traite tous ses arguments comme des arguments du script quil lit sur lentrée standard. Loption -s
détermine uniquement comment bash interprète ses arguments de ligne de commande, pas si linstance de shell est interactive.
Une instance de bash est toujours interactive si elle est démarrée avec loption -i
. Sans -i
, il nest interactif que si aucun nom de script nest transmis (-s
influence cela) et que lentrée standard et lerreur standard sont connectées à un terminal.
Le test de PS1
ne vous dit pas si une instance de shell est interactive.¹ Vous pouvez désactiver PS1
dans un shell interactif. Inversement, un shell non interactif hérite souvent de PS1
de son environnement. Le moyen fiable de tester si le shell fonctionne de manière interactive est de tester si $-
contient i
.
Le read
intégré fonctionne depuis nimporte quel shell, interactif ou non. Il lit tout ce qui est connecté à lentrée standard du shell (à moins dêtre redirigé). Si vous essayez de lire à partir du même descripteur de fichier où bash lit le script quil est en cours dexécution, vous finirez par sauter une ligne dans le script (pas nécessairement à lendroit souhaité); par exemple, si vous « passez un script sur lentrée standard de bash » et que vous voulez lire une ligne depuis le terminal, vous devez rediriger le read
call: read line </dev/tty
.
Les descripteurs de fichier 0, 1 et 2 existent toujours (sauf sils « ont été fermés); ce sont respectivement lentrée standard, la sortie standard et lerreur standard. Le fait que le shell soit interactif ou non na aucun rapport avec ce que les descripteurs standards pointent, sauf que le fait que fd 0 et 2 soient des terminaux influence le statut interactif du shell.
¹ Oui, je « m sachez quil existe des pages Web qui le revendiquent. Ils « se trompent.
Réponse
Un peu plus dinformations sur les shells interactifs:
Vous pouvez savoir si un shell est interactif ou non en vérifiant $-
. Si $-
contient un i
, alors le shell est interactif.
Un shell est interactif lorsquil lit directement lentrée de lutilisateur. Un shell non interactif lit les commandes dun fichier ligne par ligne et les exécute. Il ne rend pas le shell interactif lors de la lecture de quoi que ce soit à partir de stdin depuis le script, car « le script lit lentrée, pas le shell » (je ne sais pas comment lexpliquer mieux).
labdebian# cat ./test #!/bin/bash echo Hello World echo $- read; echo $REPLY echo $- labdebian# bash test Hello World hB I"m typing this I"m typing this hB labdebian# bash -i test Hello World himB I"m typing this I"m typing this himB
Commentaires
- Ce qui était déroutant, cest dans la documentation de bash, ils disent quil se bloquera si vous utilisez read dans un non – shell interactif
Réponse
-s
ne rend pas votre shell interactif. Utilisez plutôt -i
.