我正在嘗試執行以下操作:
- 從鍵盤快速鍵開啟 gnome 終端,例如 Ctrl+Shift+E。
- 在終端機中運行命令。具體來說,命令是
gio open $(fzf)
。該命令是互動式的並啟動外部程式(例如 evince)。 - 一旦外部程式啟動,關閉終端而不關閉外部程式。
我對上面的步驟 2 感興趣的命令是gio open $(fzf)
:我使用模糊查找器選擇一個文件fzf
,然後該命令gio open
使用 gnome 的預設程式開啟該文件。
我可以一一執行上面的三個步驟:
- 我可以將設定中的鍵盤快捷鍵綁定到
gnome-terminal
:它按預期打開終端。 - 然後我在新開啟的終端機中輸入我的命令
gio open $(fzf)
:如果我從 中選擇一個 pdf 文件fzf
,它將使用所選文件開啟 evince。 - 我可以輸入 Ctrl+D 來關閉終端機。這樣做會不是密切的證據。這是預期的行為。
手動執行這三個步驟是可行的。
我的目標是將上述工作自動化。它應該按如下方式工作。當我輸入鍵盤快捷鍵 Ctrl+Shit+E(或任何其他快捷鍵)時,應該會打開一個 gnome 終端,並且gio open $(fzf)
應該運行該命令。一旦交互命令完成(打開外部程序,例如 evince),終端應該自動關閉,而不關閉 evince。
我嘗試過的。
- 使用該命令新增鍵盤快捷鍵
gnome-terminal -- bash -c "gio open $(fzf)"
不起作用。按組合鍵沒有任何作用。 - 如果我
gio open $(fzf)$
在 .bashrc 末尾添加該命令,則帶有該命令的鍵盤快捷鍵gnome-terminal
將打開終端並執行該命令。一旦我選擇了 pdf 文件,evince 就會使用所選文件開啟(是的!!!)。但是,如果我按 Ctrl+D,終端將關閉,evince 也會關閉(也許是因為 evince 是子進程?)。 - 如果我
gio open $(fzf)$ && exit
在 .bashrc 末尾添加該命令,則帶有該命令的鍵盤快捷鍵gnome-terminal
將打開終端並運行該命令,但是一旦我選擇一個文件,終端就會關閉而不會打開 evince(evince 可能已啟動並獲得立即關閉,我不知道)。
請注意,使用 .bashrc 主要是為了測試目的,我想避免污染我的 .bashrc。
答案1
但是,如果我按 Ctrl+D,終端將關閉,evince 也會關閉(也許是因為 evince 是子進程?)
是的,當然,它是子進程,您應該以“分離”方式運行此進程。之後,您可以結束主進程(在您的情況下 - 終端)。
這是如何運行獨立進程的詳細答案。
https://superuser.com/questions/178587/how-do-i-detach-a-process-from-terminal-entirely
作為另一種方式,您可以使用下一個快捷方式:
bash -c "some_command" > /dev/null &2>&1
在這種情況下,終端機視窗根本不會出現,您不需要在 .bashrc 檔案中新增任何內容。
答案2
同樣的事情困擾著我,所以我來回答這個老問題。我發現了這一點,xdg-open
並且gio open
在使用這種腳本時遇到了麻煩,而且我還注意到 gnome-terminal 也遇到了麻煩。例如,xdg-open 可以開啟 gedit 編輯文字文件,但不能開啟 evice 來查看 pdf。所以我將以下腳本與xterm -e
.請注意,這會將 nohup.out 檔案保留在您的主目錄中,如果您對此感到困擾,可以重定向 stdout。
#!/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