Öffnen eines Terminals für das aktuelle Bash-Skript, falls es nicht in einem gestartet wurde

444
Kev

Wie kann ich ein Skript dazu bringen, sich in einem Terminal-Fenster neu zu starten, wenn es in einem nicht gestartet wurde?

Basierend auf dieser Frage habe ich versucht, in einer Datei namens testtermmarkierte ausführbare Datei:

#! /bin/sh if [ -t 0 ]; # stdin then echo "yay! terminal!" else Terminal sh ~/Desktop/testterm fi 

... aber Haiku Terminalöffnet sich einfach und zeigt nie etwas oder manchmal öffnet er sich und geht sofort weg.

Wenn ich das Terminal eingebe Terminal sh ~/Desktop/testterm, funktioniert es einmal und öffnet ein Terminal mit "yay! Terminal!" Darin ergeben aber dann nachfolgende Versuche leere Terminals.

2
Nennen Sie Ihre Datei nicht "test", da Sie wahrscheinlich das System "/ usr / bin / test" nennen. slhck vor 11 Jahren 1
Danke, daran hatte ich nicht gedacht. Frage bearbeitet (Es funktioniert immer noch nicht, aber ich weiß, dass es diesmal nicht wegen eines Namenskonflikts ist.) Kev vor 11 Jahren 0
Funktioniert der Test? Ersetzen Sie `Terminal 'durch einen anderen Befehl. Wird es korrekt ausgeführt? terdon vor 11 Jahren 1
Ich weiß nicht viel über Haiku, aber ich würde Folgendes versuchen: 1. Entfernen Sie den Abstand zwischen dem Shebang und `/ bin / sh`. 2. Verwenden Sie einen relativen oder absoluten Pfad für den Test. 3. Versuchen Sie, `Terminal testterm &` von einem Terminal aus auszuführen. Alle Terminal-Emulatoren, mit denen ich gearbeitet habe, erfordern vor der ausführbaren Datei einen Schalter (z. B. `xterm -e. / Testterm`). Dennis vor 11 Jahren 1
@terdon, ja `StyledEdit` öffnet sich nicht mit` Terminal`. @Dennis, 1. scheint keinen Unterschied zu machen (plus, alle meine anderen Skripte beginnen so) 2. haben versucht, auch keinen Unterschied 3. es macht das gleiche wie das Skript und öffnet ein Terminal, das niemals etwas anzeigt. "Terminal --help" erwähnt keine Option für eine ausführbare Datei, aber wenn Sie ein Argument übergeben, scheint es nach einer Datei zu suchen ... möglicherweise, um sie jedoch nicht auszuführen? Kev vor 11 Jahren 0
Angenommen, "Terminal" funktioniert wie "xterm". Die gesuchte Datei ist die Shell, die ausgeführt werden soll. Wenn ja, fällt mir ein Workaround ein. Versuchen Sie, `Terminal sh` auszuführen, verwendet es` sh` anstelle von `bash`? terdon vor 11 Jahren 1
@terdon, yep, confirmed via `echo $0`. So I tried `Terminal sh ~/Desktop/testterm`. Oddly, this works if I try it from a `Terminal` window, but not if I double-click the testterm icon (same result as all along.) Kev vor 11 Jahren 0

1 Antwort auf die Frage

1
terdon

A hack you could try is the following:

  1. Create a special bash .rc file that sources your bashrc and runs your script. Lets call it ~/foo.rc

    $ cat ~/foo.rc #!/bin/sh ~/Desktop/testterm 
  2. Create a new "shell" that calls bash with ~/foo.rc as its .rc file. Save this script as fake_shell somewhere in your $PATH (for example, ~/config/bin) and make it executable:

  3. Now, in your testterm script, launch Terminal using fake_shell as the shell.

The script becomes:

#!/bin/sh if [ ! -t 0 ]; # stdin then TIMESTAMP=`date +%Y%m%d%H%M` echo "#!/bin/sh source /boot/common/etc/profile $0" > ~/temp_term$TIMESTAMP.rc echo "#!/bin/sh bash --rcfile ~/temp_term$TIMESTAMP.rc" > ~/config/bin/temp_shell$TIMESTAMP chmod a+x ~/config/bin/temp_shell$TIMESTAMP Terminal temp_shell$TIMESTAMP rm -f ~/config/bin/temp_shell$TIMESTAMP rm -f ~/temp_term$TIMESTAMP.rc fi echo "yay! terminal!" # your script here exit 
@Kev, siehe meine aktualisierte Antwort für einen Hack, den Sie ausprobieren können. terdon vor 11 Jahren 0
Genial! 99% des Weges dorthin, das ist alles was ich brauche. Ein paar Dinge, die Eingabeaufforderung im neuen Fenster ist `bash-4.0 #` anstelle von `/>` (spielt keine Rolle), und wenn Sie das Fenster schließen, heißt es: `Der Prozess 'bash' läuft noch . Wenn Sie das Terminal schließen, wird der Vorgang abgebrochen. "(Terminals schließen normalerweise nur. Auch keine große Sache.) Kev vor 11 Jahren 0
@Kev, die Eingabeaufforderung kann geändert werden, indem die Variable `PS1` in` foo.rc` festgelegt wird. Der Grund dafür ist, dass `/ etc / bash.bashrc` nicht gelesen wird. Sie können dies auch beheben, indem Sie sie als Quelle verwenden in `foo.rc`. Der Fehler liegt daran, dass Sie explizit `/ bin / bash` starten. Versuchen Sie, im Hintergrund zu starten (`&`, obwohl ich bezweifle, dass dies funktionieren wird). terdon vor 11 Jahren 0
Das `&` lässt das Terminal wieder leer erscheinen, obwohl dies die korrekte Syntax für asyncrone Befehle in Haiku ist. Danke für den PS1-Hinweis, ich werde das nachschlagen. Übrigens nicht sicher, warum mein Schnitt komisch aussah ... Kev vor 11 Jahren 0