Ich versuche Folgendes durchzuführen:
- Öffnen Sie ein Gnome-Terminal über eine Tastenkombination, etwa Strg+Umschalt+E.
- 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). - 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 open
diese Datei mit dem Standardprogramm von Gnome.
Ich kann die drei oben genannten Schritte nacheinander ausführen:
- Ich kann in den Einstellungen eine Tastenkombination an Folgendes binden
gnome-terminal
: Es öffnet wie erwartet ein Terminal. - Dann gebe ich in das neu geöffnete Terminal meinen Befehl ein
gio open $(fzf)
: Wenn ich eine PDF-Datei auswählefzf
, wird evince mit der ausgewählten Datei geöffnet. - 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 Befehlgnome-terminal
das 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)$ && exit
am Ende meiner .bashrc-Datei hinzufüge, öffnet eine Tastenkombination mit dem Befehlgnome-terminal
das 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-open
und gio open
habe 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