it-swarm.com.de

Wie starte ich ein Terminal mit einem bestimmten Text, der bereits in der Befehlszeile eingegeben wurde?

Anstatt meine Frage neu zu formulieren, möchte ich Ihnen den gewünschten Anwenderfall beschreiben:

Ich erstelle ein kurzes Shell-Skript, um den Befehl "gnome-terminal --someoptionflagname 'my text to be posted'" auszuführen, und führe dieses Skript aus.

Das Gnome-Terminal öffnet sich mit der Eingabeaufforderung, gefolgt von meinem Text.

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

Kann das gemacht werden?

25
emf

Sie können dies mit expect ( install ) tun. Erstellen und ausführbar machen ~/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

und starte Gnome Terminal mit:

gnome-terminal -e ~/bin/myprompt
32
ændrük

Wenn ich das richtig verstehe, soll Ihre erste Eingabezeile vorab mit Inhalten gefüllt werden, die Sie über die Gnome-Terminal-Befehlszeile übergeben.

Ich weiß nicht, wie ich genau das mit bash machen soll, aber hier ist etwas, das nahe kommt. Fügen Sie in Ihrem ~/.bashrc ganz am Ende die folgende Zeile hinzu:

history -s "$BASH_INITIAL_COMMAND"

Führen Sie gnome-terminal -x env BASH_INITIAL_COMMAND='my text to be posted' bash aus und drücken Sie Up an der Eingabeaufforderung, um den Text abzurufen.

Beachten Sie auch, dass, wenn Sie set -o history gefolgt von Kommentaren am Ende Ihres .bashrc einfügen, diese beim Start der Bash in den Verlauf aufgenommen werden, sodass Sie sie als Grundlage für die Bearbeitung verwenden können, indem Sie sie mit erreichen das Up Schlüssel und Entfernen des ersten #.

8
Gilles

ændrüks Vorschlag ist sehr gut und hat für mich funktioniert, der Befehl ist jedoch im Skript fest codiert, und wenn Sie die Größe des Terminalfensters ändern, funktioniert er nicht gut. Unter Verwendung seines Codes als Basis habe ich die Möglichkeit hinzugefügt, dem myprompt-Skript den Befehl als Argument zu senden, und dieses Skript behandelt die Größenänderung des Terminalfensters korrekt.

#!/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

und starte Gnome Terminal mit:

gnome-terminal -e "~/bin/myprompt \"my text to be posted\""
8

ændrüks Antwort ist in Ordnung, aber vielleicht ein bisschen schwergewichtig für die Aufgabe.

Hier ist ein Skript, das ein Skript basierend auf seinen Argumenten schreibt

#!/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

Wenn Sie nicht viel Shell-Programmierung gemacht haben, scheint es hier mehr Magie zu geben als dort. Zuerst benenne ich eine temporäre Datei für das Skript, wobei $$ die Prozess-ID der Shell ist, die dieses Skript ausführt. Die Metapher /tmp/something.$$ wird verwendet, wenn zwei Instanzen dieses Skripts gleichzeitig ausgeführt werden. Sie versuchen jedoch nicht, dieselbe temporäre Datei zu verwenden.

Die Variable $Shell wird auf den Namen der Shell gesetzt, auf der das Skript ausgeführt wird. Wenn Sie/usr/bin/bash verwenden, möchten Sie wahrscheinlich, dass das Miniskript es auch verwendet.

Der "[email protected]" ist ein Shell-Idiom für "interpoliere alle meine Argumente und zitiere sie, wenn nötig". Diese eigenartige Syntax bewirkt

script.sh 'my file' your\ file

die Argumente als zwei Elemente zu interpolieren

"my file" "your file"

anstelle der vier, die [email protected] ergeben würde

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

In den letzten Zeilen des Skripts wird veranlasst, dass ein Gnome-Terminal das Mini-Skript ausführt und anschließend eine interaktive Shell startet. Wenn das Gnome-Terminal beendet wird, wird das temporäre Skript entfernt, da die Müllablagerung nicht mehr korrekt ist.

Die letzte Zeile ist kein Teil des Miniskripts. Sie zeigt, dass das Miniskript funktioniert. Befindet sich das obige 11-Zeilen-Skript in einer Datei mit dem Namen rt.sh, dann macht das chmod es ausführbar und wird dann ausgeführt.

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

Das Ergebnis all dessen ist ein Gnome-Terminal, das gestartet wird und angezeigt wird

hello world

in der ersten Zeile und startet dann eine interaktive Shell:

[email protected]:~$
1
msw

Die beiden Antworten, die ich am liebsten gelöst habe, sind expect und diese , wobei die Verwendung des Flags _--init-file_ entweder im Shebang oder beim Ausführen des Terminals empfohlen wird:

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

... und führe es aus als:

_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 ist wahrscheinlich die bessere Lösung (aus Gründen, die ich skizzieren werde), außer dass ich nicht steuern kann, ob es in meiner Zielumgebung installiert ist.

Das Problem, auf das ich mit bashs _--init-file_ und _gnome-terminal--command_ gestoßen bin, ist, dass die Shell beim Ausführen von Init-Skripten keinen Zugriff auf STDIN hat. Wenn ich zum Beispiel etwas ausführen möchte, für das Benutzereingaben erforderlich wären (FTP, Telnet usw.), die übergeordnete Shell danach jedoch ausgeführt wird, funktioniert dies nicht. Die einzige Ausnahme, die ich bisher gesehen habe, ist ssh:

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

... aber was ich brauche, ist komplizierter als dieses Spielzeugbeispiel. Wie auch immer, ich hoffe, das _--init-file_ Zeug ist nützlich für jeden, der diese Frage liest.

0