Comment démarrer un terminal avec certains textes déjà saisis sur la ligne de commande?

22

Plutôt que de reformuler ma question, permettez-moi de vous décrire le cas utilisateur souhaité:

Je crée un script shell court pour exécuter la commande "gnome-terminal --someoptionflagname 'mon texte à publier", et exécuter ce script.

Gnome-terminal apparaît, avec une invite de ligne de commande suivie de mon texte.

ie: [email protected]:/$ my text to be posted

Cela peut-il être fait?

    
posée emf 08.10.2010 - 19:39
la source

6 réponses

30

Vous pouvez le faire avec attendre ( installer ). Créer et rendre exécutable ~/bin/myprompt :

#!/usr/bin/expect -f

# Get a Bash shell
spawn -noecho bash

# Wait for a prompt
expect "$ "

# Type something
send "my text to be posted"

# Hand over control to the user
interact

exit

et lancez Gnome Terminal avec:

gnome-terminal -e ~/bin/myprompt
    
réponse donnée ændrük 09.10.2010 - 01:06
la source
8

Si je comprends bien, vous voulez que votre première ligne d’entrée soit préremplie dans le contenu que vous transmettez sur la ligne de commande de gnome-terminal.

Je ne sais pas comment faire exactement cela avec bash, mais voici quelque chose qui se rapproche. Dans votre ~/.bashrc , ajoutez la ligne suivante à la toute fin:

history -s "$BASH_INITIAL_COMMAND"

Exécutez gnome-terminal -x env BASH_INITIAL_COMMAND='my text to be posted' bash et appuyez sur Up à l’invite pour rappeler le texte.

Notez également que si vous mettez set -o history suivi de commentaires à la fin de votre .bashrc , ils seront entrés dans l’historique au démarrage de bash, vous pouvez donc les utiliser comme base pour les atteindre avec le Up clé et en supprimant le # initial.

    
réponse donnée Gilles 09.10.2010 - 02:02
la source
8
La suggestion de

ændrük est très bonne et a fonctionné pour moi, cependant la commande est codée en dur dans le script, et si vous redimensionnez la fenêtre du terminal, cela ne fonctionne pas bien. En utilisant son code comme base, j'ai ajouté la possibilité d'envoyer le script myprompt en tant qu'argument, et ce script gère correctement le redimensionnement de la fenêtre du terminal.

#!/usr/bin/expect

#trap sigwinch and pass it to the child we spawned
#this allows the gnome-terminal window to be resized
trap {
 set rows [stty rows]
 set cols [stty columns]
 stty rows $rows columns $cols < $spawn_out(slave,name)
} WINCH

set arg1 [lindex $argv 0]

# Get a Bash shell
spawn -noecho bash

# Wait for a prompt
expect "$ "

# Type something
send $arg1

# Hand over control to the user
interact

exit

et lancez Gnome Terminal avec:

gnome-terminal -e "~/bin/myprompt \"my text to be posted\""
    
réponse donnée Gordon McCreight 10.12.2010 - 07:27
la source
1
La réponse de ændrük est bonne, mais peut-être un peu lourde pour la tâche.

Voici un script qui écrit un script basé sur ses arguments

#!/bin/sh
# terminal-plus-command: start a subordinate terminal which runs
# the interactive shell after first running the command arguments

tmpscript=/tmp/tmpscript.$$
echo "#!$SHELL" > $tmpscript
echo "[email protected]" >> $tmpscript
echo exec "$SHELL" >> $tmpscript
chmod +x $tmpscript
gnome-terminal --command $tmpscript
rm -f $tmpscript

Si vous n'avez pas fait beaucoup de programmation shell, il semble y avoir plus de magie ici. Tout d'abord, je nomme un fichier temporaire contenant le script où $$ est l'ID de processus du shell exécutant ce script. La métaphore /tmp/something.$$ est utilisée dans le cas où deux instances de ce script sont exécutées en même temps, elles n'essaieront pas d'utiliser le même fichier temporaire.

La variable $SHELL est définie sur le nom du shell exécutant le script. Si vous utilisez / usr / bin / bash, vous aimeriez probablement que le mini-script l'utilise également.

Le "[email protected]" est un idiome de shell pour "interpoler tous mes arguments, en les citant si nécessaire". Cette syntaxe particulière provoque

script.sh 'my file' your\ file

pour interpoler les arguments en deux éléments

"my file" "your file"

au lieu des quatre que [email protected] céderait

"my" "file" "your" "file"

Les dernières lignes du script permettent à un gnome-terminal de lancer l'exécution du mini-script et de démarrer un shell interactif. Lorsque le terminal gnome se termine, le script temporaire est supprimé car les déchets ne sont pas clairs.

La dernière ligne ne fait pas partie du mini-script, cela montre que le mini-script fonctionne. Si le script de 11 lignes ci-dessus se trouve dans un fichier appelé rt.sh , le chmod le rend exécutable, puis il est exécuté.

$ chmod +x rt.sh && ./rt.sh echo hello world

Le résultat de tout cela sera un terminal gnome qui démarre, affiche

hello world

sur sa première ligne puis lance un shell interactif:

[email protected]:~$
    
réponse donnée msw 09.10.2010 - 16:13
la source
0

Les deux réponses que j'ai préféré résoudre sont d'utiliser expect et celui-ci où ils recommandent d'utiliser l'indicateur --init-file soit dans le shebang soit lors de l'exécution du terminal:

#!/bin/bash --init-file
commands to run

... et l'exécuter en tant que:

xterm -e /path/to/script
# or
gnome-terminal -e /path/to/script
# or
the-terminal -e bash --init-file /path/to/script/with/no/shebang

expect est probablement la meilleure solution (pour des raisons que je vais décrire), sauf que je ne peux pas contrôler si elle est installée dans mon environnement cible.

Le problème que j'ai rencontré avec --init-file de% et gnome-terminal % c_de% comme hack pour résoudre ce problème est que le shell n'a pas accès à STDIN lors de l'exécution de scripts d'initialisation. Si, par exemple, je veux exécuter quelque chose qui nécessiterait une entrée utilisateur (ftp, telnet, etc.) mais laisser le shell parent s'exécuter après, cela ne fonctionnera pas; la seule exception que j'ai vue jusqu'ici est ssh:

xterm -e /bin/bash --init-file <(echo 'ssh -X some-machine')

... mais ce dont j'ai besoin est plus compliqué que cet exemple de jouet. Quoi qu’il en soit, j’espère que le contenu de --command sera utile à quiconque lit cette question.

    
réponse donnée Brian Vandenberg 23.01.2015 - 19:37
la source
-1

Vous pouvez utiliser les arguments -e ou -x pour exécuter une commande dans un terminal nouvellement affiché, mais ce n'est pas exactement ce que vous voulez.

    
réponse donnée Karl Bielefeldt 08.10.2010 - 19:46
la source

Lire d'autres questions sur les étiquettes