# Neues Terminal-Fenster fuer Bash Scripte?



## frager (10. Oktober 2009)

Hallo,

ich habe ein Shell-Script in einer Datei abgespeichert. Wenn ich das Script aus einem Terminal heraus aufrufe, ist alles ok. Wenn ich das Script mit einem Doppelklick starte, dann macht das Script eigentlich auch, was es machen soll, aber es oeffnet sich kein Terminal-Fenster, sodass man z.B. die Ausgaben von echo nicht sehen kann. Wie kriege ich das hin, dass das Terminal-Fenster sichtbar ist? 

Dankie schoen!


----------



## Enumerator (12. Oktober 2009)

Hi!

Welche Arbeitsumgebung benutzt Du?
Im Wesentlichen musst du nichts weiter tun als ein zweites Skript schreiben, dass einen Terminal-Emulator startet und die eigentliche Aufgabe erfüllt.
Ungefähr so:

```
lenny:~/test$ chmod +x startup.sh aufgabe.sh
lenny:~/test$ cat startup.sh 
#!/bin/sh
x-terminal-emulator -e ./aufgabe.sh

lenny:~/test$ cat aufgabe.sh 
#!/bin/sh
echo "Teeeeeeeeeeeest!"
read # wichtig, ähnlich dem "@pause" in dos...

lenny:~/test$
```

Jetzt einfach auf startup.sh anstelle von aufgabe.sh klicken.
Allerdings kann sich der Fett gedruckte Teil bei Dir auch unterscheiden - ja nachdem, wie das Ding bei Dir heisst und was es für Parameter erwartet.
Übrigens kannst Du bei den meisten Umgebungen in den Menüleisten Buttons platzieren, die einen Shell-Befehl ausführen.
In diesem Fall würde das startup.sh Skript wegfallen - einfach die Zeile als Button basteln...

Gruß
Enum


----------



## frager (12. Oktober 2009)

Dein Beispiel hat super funktioniert, danke! Ich benutze uebrigens Ubuntu (Gnome).

Der einzige Hacken dabei: mir gefaellt die zweite Datei nicht  Ich bin es von Windows gewohnt, dass man einfach irgendeine Batch-Datei, die irgendwas macht, irgendwo liegen hat, und wenn man sie anklickt, dann oeffnet sich ebe das cmd-Fenster und das Script laeuft durch.. Das ist ja bloed, dass das bei Linux so nicht geht  Das heisst dann ja, wenn ich viele Shell-Scripte rumliegen habe und zu jedem noch ein Startup-Script erstelle, dass dann ziemlich schnell die Uebersicht weg ist.

Gruss.


----------



## Matthias Reitinger (12. Oktober 2009)

frager hat gesagt.:


> Dein Beispiel hat super funktioniert, danke! Ich benutze uebrigens Ubuntu (Gnome).


Wenn ich bei Ubuntu eine ausführbare Datei auf den Desktop lege und einen Doppelklick auf diese ausführe, dann erscheint eine Dialogbox, bei der man u.a. auch auswählen kann, dass die Datei in einem neuen Terminal ausgeführt werden soll. Ist das bei dir nicht so?



frager hat gesagt.:


> Der einzige Hacken dabei: mir gefaellt die zweite Datei nicht  Ich bin es von Windows gewohnt, dass man einfach irgendeine Batch-Datei, die irgendwas macht, irgendwo liegen hat, und wenn man sie anklickt, dann oeffnet sich ebe das cmd-Fenster und das Script laeuft durch.. Das ist ja bloed, dass das bei Linux so nicht geht  Das heisst dann ja, wenn ich viele Shell-Scripte rumliegen habe und zu jedem noch ein Startup-Script erstelle, dass dann ziemlich schnell die Uebersicht weg ist.


Leg die Dateien einfach in deinem Heimverzeichnis (bzw. in einem Unterverzeichnis dessen) ab. Auf dem Desktop kannst du dann einfach einen Starter dafür erstellen (Rechtsklick auf den Desktop, Starter anlegen, Typ: Anwendung im Terminal). Dann leidet die Übersicht nicht und du hast deine Skripte alle an einem Ort gesammelt.

Grüße, Matthias


----------



## frager (12. Oktober 2009)

Matthias Reitinger hat gesagt.:


> Wenn ich bei Ubuntu eine ausführbare Datei auf den Desktop lege und einen Doppelklick auf diese ausführe, dann erscheint eine Dialogbox, bei der man u.a. auch auswählen kann, dass die Datei in einem neuen Terminal ausgeführt werden soll. Ist das bei dir nicht so?


Das WAR bei mir so und hat mich tierisch genervt, zum Glueck kann man das Abstellen: im Nautilus: Edit->Preferences->Behavior->Executable Text Files->Run executable text files when they are opened



hm, waere auch eine moeglichkeit, aber immernoch zu kompliziert.. Ich wollte das jetzt so loesen, dass ich das startup-Script ins /usr/bin/ legen, und dann die Dateizuordnung mache, dass alle .sh Dateien mit diesem Script geoffnet werden (der Dateiname wird dann als Argument uebergeben) bloss finde ich jetzt gerade nicht, wie man so eine Dateizuornung anlegt - ARGH!!


----------



## Enumerator (13. Oktober 2009)

frager hat gesagt.:


> hm, waere auch eine moeglichkeit, aber immernoch zu kompliziert.. Ich wollte das jetzt so loesen, dass ich das startup-Script ins /usr/bin/ legen, und dann die Dateizuordnung mache, dass alle .sh Dateien mit diesem Script geoffnet werden (der Dateiname wird dann als Argument uebergeben) bloss finde ich jetzt gerade nicht, wie man so eine Dateizuornung anlegt - ARGH!!



Das ist alles nicht so wild:
	
	
	



```
lenny:~/skripte$ cat termstart.sh
#!/bin/sh
SRCDIR=/home/enum/skripte
x-terminal-emulator -e $SRCDIR/`echo "$0" | sed "s/.*\///"`.sh

lenny:~/skripte$ cat hello.sh
#!/bin/sh
echo "Hello world!"
read 

lenny:~/skripte$ su
Passwort: 
lenny:/home/enum/skripte# ln -s /home/enum/skripte/termstart.sh /usr/local/bin/hello
lenny:/home/enum/skripte# exit
exit
lenny:~/skripte$ hello
lenny:~/skripte$
```

Eleganter wäre es aber, wenn Dein(e) Skript(e) via Parameterübergabe in der Lage sind ein Terminal-Fenster zu öffnen.
Obwohl, eher Geschmackssache, aber immerhin lernt man was dabei:
	
	
	



```
#!/bin/sh

NUM=1
USETERM=0
VAR=

USAGE="Echo world!
Funktionsweise: $0 [-t] [-p ...] [--] ...

    -t  Wenn -t genau ein mal übergeben wird, versucht das Skript
        ein neues Terminal-Fenster zu öffen.
    -p  Optional: Irgendetwas das nach STDOUT geschrieben wird.
    --  Alles danach wird als Text behandelt.
"

while getopts "thp:-" OPTION
    do
        if [ "$OPTION" = "p" ]
            then
                NUM=`expr $NUM + 2`
                if [ "x$VAR" = "x" ]
                    then
                        VAR="$OPTARG"
                    else
                        VAR="$VAR $OPTARG"
                fi
            else
                NUM=`expr $NUM + 1`
                case "$OPTION" in
                    t)  USETERM=`expr $USETERM + 1`;;
                    h)  echo "$USAGE"  && exit;;
                    -)  break;;
                esac
       fi
done

# Wenn genau ein -t dann im Emulator starten und 2tes -t anhängen
if [ $USETERM = 1 ]
    then
        x-terminal-emulator -e $0 -t $@
        exit $?
fi

# Vor dem -- sind Argumente, kein Text...
until [ $NUM = 0 ]
    do
        shift
        NUM=`expr $NUM - 1`
done


# Die eigentliche Aufgabe
if [ "x$VAR" = "x" ]
    then
        if [ ! "x$@" = "x" ]
            then
                echo $@
        fi
    else
        echo "$VAR $@"
fi

# Status der Aufgabe zwischenspeichern
RESULT=$?

# Pause wenn im Emulator
if (($USETERM>2))
    then
        read
fi

exit $RESULT
```

Und schon quasi Perfekt wäre ein automatischer Start im Emulator getriggert durch Umgebungsvariablen: 
	
	
	



```
#!/bin/sh
if [ "$TERM" = "dumb" ]
    then
        x-terminal-emulator -e $0 $@
        exit $?
fi
echo "Hello World!"
RESULT=$?
read
exit $RESULT
```

Allerdings habe ich spontan keine Idee wie man dafür sorgen könnte, dass Zeile 9 nur in einem explizit gestarteten Fenster ausgeführt wird.
Ausserdem bin ich mir nicht sicher ob alle Systeme beim Doppelklick auf ein Skript $TERM=dumb setzen.

Gruß
Enum

PS: Ist es nicht erbärmlich? Die highlight-Funktion hier im Forum kennt "bash" aber nicht "sh". Grund gütiger. 

Nach /usr/bin solltest Du übrigens nichts packen.
Nicht unter Linux, das ist der Paketverwaltung (apt und Konsorten) vorbehalten.
Für die eigenen Spielereien gibt es /usr/local/bin.


----------



## frager (13. Oktober 2009)

Hm, schaut schon alles interessant aus, aber das muuuuussss doch einfacher gehen! Ich will doch nur ein Shell-Script in einem Terminal-Fenster starten!! )

Aber ich habe schon viel aus deinem Beispiel gelernt - bin naemlich noch ein Laie, was Shell-Scripting angeht, deine Beispiele zu sed und getopts weiss ich zu schaetzen!

Eine Frage noch: du hast ja getestet, ob eine Variable einen leeren String als Wert hat mit der Anweisung

```
if [ "x$VAR" == "x" ]
```

in Windows Batch ging das immer mit 

```
if "%VAR%" == ""
```

geht das in bash nicht? Also sprich

```
if [ "$VAL" == "" ]
```


----------



## Enumerator (13. Oktober 2009)

Hi!

Frag mich nicht.
Das hab' ich mir vor langer Zeit angewöhnt aus irgendeinem Grund. 
Ich glaube das gibt zumindest Portabilitätsprobleme.
Es kann aber auch einfach nur ein Mythos sein.
Oder stammt aus einer anderen Sprache.
Oder einer anderen Shell.
Oder gar DOS?!

Gruß
Enum

[EDIT]

Mir ist gerade eine Lösung für mein Problem oben bzw. Deines allgemein eingefallen.

```
#!/bin/sh
EMU=0
if [ "$TERM" = "dumb" ]
    then
        x-terminal-emulator -e $0 --an-argument-you-would-never-pass $@
        exit $?
    else
        if [ "$1" = "--an-argument-you-would-never-pass" ]
            then
                shift
                EMU=1
        fi
fi
echo "Hello World!"
RESULT=$?
if [ "$EMU" = "1" ]
    then
        read
fi
exit $RESULT
```
Ohne "x"


----------



## frager (14. Oktober 2009)

> Mir ist gerade eine Lösung für mein Problem oben bzw. Deines allgemein eingefallen.


"Mir ist so nebenbei die Loesung eingefallen"


----------

