次のことを実行しようとしています:
- キーボード ショートカット (Ctrl+Shift+E など) から gnome ターミナルを開きます。
- ターミナルでコマンドを実行します。concrenetess の場合、コマンドは です
gio open $(fzf)
。コマンドは対話型で、外部プログラム (evince など) を起動します。 - 外部プログラムが起動したら、外部プログラムを閉じずにターミナルを閉じます。
上記の手順 2 で私が興味を持っているコマンドは次のとおりですgio open $(fzf)
。ファジー ファインダーを使用してファイルを選択しfzf
、コマンドによってgio open
そのファイルが gnome のデフォルト プログラムで開かれます。
上記の 3 つの手順を 1 つずつ実行できます。
- 設定でキーボードショートカットを次のようにバインドできます
gnome-terminal
: 期待どおりにターミナルが開きます。 - 次に、新しく開いたターミナルにコマンドを入力します
gio open $(fzf)
。 から pdf ファイルを選択するとfzf
、選択したファイルで evince が開きます。 - Ctrl+Dを押すとターミナルを閉じることができます。これを行うとない証拠を閉じます。これが意図された動作です。
これら 3 つの手順を手動で実行すると機能します。
私の目標は上記を自動化することです。次のように動作するはずです。キーボード ショートカット Ctrl+Shit+E (または他のショートカット) を入力すると、gnome-terminal が開き、コマンドがgio open $(fzf)
実行されます。対話型コマンド (evince などの外部プログラムを開く) が完了するとすぐに、evince は閉じずにターミナルが自動的に閉じます。
私が試したこと。
- コマンドにキーボード ショートカットを追加しても
gnome-terminal -- bash -c "gio open $(fzf)"
機能しません。キーの組み合わせを押しても何も起こりません。 gio open $(fzf)$
.bashrc の最後にコマンドを追加すると、コマンドのキーボード ショートカットによってgnome-terminal
ターミナルが開き、コマンドが実行されます。PDF ファイルを選択するとすぐに、選択したファイルで evince が開きます (yeah!!!)。ただし、その後 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 を開いてテキストファイルを編集できますが、evince を開いて 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