Starten Sie das Terminal über eine Tastenkombination, führen Sie den interaktiven Befehl aus und beenden Sie Ubuntu 17.10

Starten Sie das Terminal über eine Tastenkombination, führen Sie den interaktiven Befehl aus und beenden Sie Ubuntu 17.10

Ich versuche Folgendes durchzuführen:

  1. Öffnen Sie ein Gnome-Terminal über eine Tastenkombination, etwa Strg+Umschalt+E.
  2. Führen Sie einen Befehl im Terminal aus. Der Befehl lautet beispielsweise gio open $(fzf). Der Befehl ist interaktiv und startet externe Programme (wie z. B. evince).
  3. Sobald das externe Programm gestartet ist, schließen Sie das Terminal, ohne das externe Programm zu schließen.

Der Befehl, der mich für Schritt 2 oben interessiert, ist gio open $(fzf): Ich wähle eine Datei mit dem Fuzzy Finder aus fzf, und dann öffnet der Befehl gio opendiese Datei mit dem Standardprogramm von Gnome.

Ich kann die drei oben genannten Schritte nacheinander ausführen:

  1. Ich kann in den Einstellungen eine Tastenkombination an Folgendes binden gnome-terminal: Es öffnet wie erwartet ein Terminal.
  2. Dann gebe ich in das neu geöffnete Terminal meinen Befehl ein gio open $(fzf): Wenn ich eine PDF-Datei auswähle fzf, wird evince mit der ausgewählten Datei geöffnet.
  3. Ich kann Strg+D drücken, um das Terminal zu schließen. Dies funktioniertnichtBeweis schließen. Dies ist das beabsichtigte Verhalten.

und das manuelle Ausführen dieser drei Schritte funktioniert.

Mein Ziel ist es, das oben genannte zu automatisieren.Es sollte folgendermaßen funktionieren. Wenn ich die Tastenkombination Strg+Scheiße+E (oder eine andere) eingebe, sollte sich ein Gnome-Terminal öffnen und der Befehl gio open $(fzf)sollte ausgeführt werden. Sobald der interaktive Befehl ausgeführt wird (der ein externes Programm wie evince öffnet), sollte sich das Terminal automatisch schließen, ohne evince zu schließen.

Was ich versucht habe.

  • Das Hinzufügen einer Tastenkombination mit dem Befehl gnome-terminal -- bash -c "gio open $(fzf)"funktioniert nicht. Das Drücken der Tastenkombination bewirkt nichts.
  • Wenn ich den Befehl gio open $(fzf)$am Ende meiner .bashrc-Datei hinzufüge, öffnet eine Tastenkombination mit dem Befehl gnome-terminaldas Terminal und der Befehl wird ausgeführt. Sobald ich eine PDF-Datei auswähle, wird evince mit der ausgewählten Datei geöffnet (yeah!!!). Aber wenn ich dann Strg+D drücke, schließt sich das Terminal und auch evince (vielleicht weil evince ein Unterprozess ist?).
  • Wenn ich den Befehl gio open $(fzf)$ && exitam Ende meiner .bashrc-Datei hinzufüge, öffnet eine Tastenkombination mit dem Befehl gnome-terminaldas Terminal und der Befehl wird ausgeführt, aber sobald ich eine Datei auswähle, schließt sich das Terminal, ohne evince zu öffnen (evince wurde möglicherweise gestartet und sofort wieder geschlossen, das kann ich nicht sagen).

Beachten Sie, dass das Spielen mit .bashrc hauptsächlich zu Testzwecken diente. Ich möchte eine Verunreinigung meiner .bashrc vermeiden.

Antwort1

Wenn ich dann aber Strg+D drücke, wird das Terminal geschlossen und auch evince (vielleicht, weil evince ein Unterprozess ist?)

Ja, klar, es ist ein Unterprozess und Sie sollten diesen Prozess als „getrennt“ ausführen. Danach können Sie den Hauptprozess beenden (in Ihrem Fall das Terminal).

Hier finden Sie eine ausführliche Antwort zum Ausführen getrennter Prozesse.

https://superuser.com/questions/178587/wie-löse-ich-einen-prozess-vom-terminal-entirely ab

Alternativ können Sie auch die folgende Tastenkombination verwenden:

bash -c "some_command" > /dev/null &2>&1

In diesem Fall wird das Terminalfenster überhaupt nicht geöffnet und Sie müssen Ihrer .bashrc-Datei nichts hinzufügen.

Antwort2

Das Gleiche hat mich geärgert, also beantworte ich diese alte Frage. Ich habe das gefunden xdg-openund gio openhabe Probleme mit dieser Art von Skript, und mir ist auch aufgefallen, dass Gnome-Terminal Probleme damit hat. Beispielsweise kann xdg-open gedit öffnen, um Textdateien zu bearbeiten, aber nicht evince, um PDFs anzuzeigen. Daher verwende ich das folgende Skript mit xterm -e. Beachten Sie, dass dadurch nohup.out-Dateien in Ihrem Home-Verzeichnis verbleiben. Sie können stdout umleiten, wenn Sie das stört.

#!/bin/bash

file="$(fzf)"

[ - n "$file" ] || exit 1

end="${file##*.}"

case $end in
  pdf | djvu | ps )
    exec nohup evince "$file"
    ;;
  * )
    exec nohup xdg-open "$file"
    ;;
esac

verwandte Informationen