J'ai un script Bash que j'essayais de faire pour m'aider à exécuter une commande plutôt complexe avec de petites modifications qu'il me poserait par écho et lirait.
J'ai trouvé des solutions pour le forcer à exécuter un terminal pour exécuter la commande, mais cela ne m'intéresse pas. Ce que j'aimerais, c'est que si j'espace et que je tape simplement sur Entrée dans Nautilus (en le faisant fonctionner avec Run Software), il affichera simplement une notification disant "Veuillez exécuter ceci à partir d'un terminal".
Je peux faire apparaître le popup - comme je connais la commande - mais je ne peux pas obtenir le script Bash pour dire s'il est exécuté à l'intérieur d'un terminal ou non, il semble toujours le penser. Est-ce même possible?
||
intérieur[ … ]
comme ça? Si vous l'utilisez,[[ … ]]
ce serait bien, mais normalement, le||
est utilisé pour séparer les commandes et il[ -t 0
s'agit d'une invocation incorrecte[
car sa dernière]
est manquante. Il n'y a généralement pas de commande-p
non plus. Je suis d'accord pour tester un terminal; c'est probablement la façon de procéder. C'est juste la syntaxe qui m'inquiète.||
est vu avant l']
argument final requis pour[
.PS1
n'est pas un test fiable pour savoir si le shell est interactif. «Si un script doit tester s'il s'exécute dans un shell interactif» est également déroutant: cela devrait être le cas si du code doit être testé - un script ne s'exécute généralement pas dans un shell interactif (mais il peut l'être, s'il provient) . Test pouri
en$-
est la bonne manière de vérifier si le shell est interactif. Tester-t 0
ou-t 2
est la bonne façon de savoir si le script s'exécute dans un terminal, ce qui est différent d'être interactif.Utilisez la variable bash $ SHLVL pour détecter le niveau d'imbrication du shell. Dans un script exécuté `` brut '' en double-cliquant, ce sera 1, dans un script exécuté dans un terminal, ce sera 2.
la source
Bien que la réponse de goldilocks soit probablement correcte dans le cas typique, il semble qu'il y ait des cas de bord. Dans mon propre cas, mon xserver est configuré pour démarrer
tty1
et il ne quitte jamais ce tty. Si Xorgstdout
est un TTY, il semble que les clients auront ce TTY lié à leur descripteur de fichier par défaut.Voici comment j'ai résolu mon problème:
Je n'ai pas testé cela pour voir si cela fonctionne sur une configuration X plus standard, et je doute également beaucoup que ce soit le seul cas de bord. Si quelqu'un trouve une solution plus généralement applicable, veuillez revenir et nous le dire.
la source
Une autre, en utilisant les options de bash variable initialisée interne,
$-
.De
.bashrc
,la source
cmd | sh -i | cmd
.