tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
8
ZUGRIFFE
1977
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Registriert seit
    Apr 2004
    Ort
    Bbg
    Beiträge
    200
    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!
     

  2. #2
    Avatar von Enumerator
    Enumerator Enumerator ist offline Mitglied Kamel
    Registriert seit
    Jan 2007
    Ort
    Schreibtisch
    Beiträge
    525
    Blog-Einträge
    2
    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:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
    lenny:~/test$ chmod +x startup.sh aufgabe.sh
    lenny:~/test$ cat startup.sh 
    #!/bin/sh
    [B]x-terminal-emulator -e[/B] ./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
     
    Zitat Zitat von Aba Assa
    "Zitate sind so etwas wie Outsourcing des Geistes."
    just-lyrics.org :: my-lyrics.org

  3. #3
    Registriert seit
    Apr 2004
    Ort
    Bbg
    Beiträge
    200
    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.
     

  4. #4
    Registriert seit
    Dec 2001
    Ort
    Bayern
    Beiträge
    5.806
    Blog-Einträge
    5
    Zitat Zitat von frager Beitrag anzeigen
    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?

    Zitat Zitat von frager Beitrag anzeigen
    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
     
    „Gib einem Menschen einen Fisch, und er wird für einen Tag satt. Lehre ihn Fischen, und er wird ein Leben lang satt.“
    “For every complex problem, there is an answer that is short, simple and wrong.”
    “Pessimism is safe, but optimism is a lot faster!”


    Aktuelles Coding Quiz: #17 - Wörter kreuz und quer

  5. #5
    Registriert seit
    Apr 2004
    Ort
    Bbg
    Beiträge
    200
    Zitat Zitat von Matthias Reitinger Beitrag anzeigen
    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!!
     

  6. #6
    Avatar von Enumerator
    Enumerator Enumerator ist offline Mitglied Kamel
    Registriert seit
    Jan 2007
    Ort
    Schreibtisch
    Beiträge
    525
    Blog-Einträge
    2
    Zitat Zitat von frager Beitrag anzeigen
    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:
    Code Gar kein:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    
    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:
    Code bash:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    
    #!/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:
    Code bash:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    #!/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.

    [EDIT]
    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.
    Geändert von Enumerator (13.10.09 um 03:41 Uhr)
     
    Zitat Zitat von Aba Assa
    "Zitate sind so etwas wie Outsourcing des Geistes."
    just-lyrics.org :: my-lyrics.org

  7. #7
    Registriert seit
    Apr 2004
    Ort
    Bbg
    Beiträge
    200
    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
    Code :
    1
    
    if [ "x$VAR" == "x" ]

    in Windows Batch ging das immer mit
    Code :
    1
    
    if "%VAR%" == ""

    geht das in bash nicht? Also sprich
    Code :
    1
    
    if [ "$VAL" == "" ]
     

  8. #8
    Avatar von Enumerator
    Enumerator Enumerator ist offline Mitglied Kamel
    Registriert seit
    Jan 2007
    Ort
    Schreibtisch
    Beiträge
    525
    Blog-Einträge
    2
    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.
    Code bash:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    
    #!/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"
    Geändert von Enumerator (13.10.09 um 19:38 Uhr)
     
    Zitat Zitat von Aba Assa
    "Zitate sind so etwas wie Outsourcing des Geistes."
    just-lyrics.org :: my-lyrics.org

  9. #9
    Registriert seit
    Apr 2004
    Ort
    Bbg
    Beiträge
    200
    Mir ist gerade eine Lösung für mein Problem oben bzw. Deines allgemein eingefallen.
    "Mir ist so nebenbei die Loesung eingefallen"
     

Ähnliche Themen

  1. Terminal-Fenster automatisch schließen
    Von DaRealMC im Forum Mac OS
    Antworten: 5
    Letzter Beitrag: 24.03.09, 20:21
  2. Antworten: 2
    Letzter Beitrag: 19.08.06, 12:38
  3. SWT Fenster erzeugt neues SWT Fenster
    Von Loro im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 1
    Letzter Beitrag: 26.12.04, 15:13
  4. Antworten: 1
    Letzter Beitrag: 18.11.04, 14:43
  5. Antworten: 10
    Letzter Beitrag: 26.10.04, 08:14