xdg-openを使用して、新しいプロセスでURLを開きます


13

私はCrunchbang(Debianに基づいており、terminatorを使用しています)をWeb開発環境として実験し始めていxdg-openます。私が苦労していることの1つはの動作です。私はOSXのバックグラウンドを持っているので、この質問が密集したとしても許してくれます。

でURLを開き、xdg-open http://www.google.com引き続き同じ端末ウィンドウを使用して作業できるようにしたいと思います(openOSXでの機能です)。現時点でxdg-openは、ブラウザウィンドウを閉じるか、で手動で終了するまで、使用すると現在のタブ/セッションが占有されますctrl + c。新しいプロセスを開始して、URLを開き、ページ上のデータを参照し、追加のタブ/ウィンドウで同じタブ/ウィンドウで使用できるようにすることを望んでいます。


どのWebブラウザを使用していますか?
クリスティアンシウピトゥ14

回答:


11

奇妙なことに、私のDebianではそのままの状態で動作します。バックグラウンドで実行してみてください:

xdg-open http://www.google.com &

これらの行を~/.bashrcファイルに追加することで、これを関数にすることができます。

function open () {
    xdg-open "$*" &
}

その後、単純に実行することができopen http://www.google.com、バックグラウンドで実行されます。


1
これはうまく機能します。toへの単純なエイリアスopen(つまり、open = 'xdg-open')を望んでいましたがxdg-open <url> &、シェル関数を使用せずに機能を取得する方法はありますか?
ニックトムリン

@NickTomlin私の知る限りではありませんが、機能に対して何がありますか?更新された回答でわかるように、エイリアスとほぼ同じくらい簡単です。
テルドン

特定のバイアスではなく、Mac OSと* nixの両方のフレーバーに同じエイリアスを使用(および再利用)しようとしているため、関数を回避したいと考えていました。
ニックトムリン

できない理由はありません。問題のすべてのシステムでbashを使用する限り、関数はシェルに依存し、完全に機能するはずです。
テルドン

Fedora 20でもそのまま使用できます。
クリスティアンシウピトゥ14

7

プロセスをバックグラウンドジョブとして開始するのではなく、現在のシェルからプロセスを切り離したい場合xdg-open http://www.google.com &detachユーティリティが好きです:

detach xdg-open http://www.google.com

これのエイリアスを作成できます。私は好きdetach超えるnohupその呼び出しがクリーンであるように、デフォルトでstdoutとstderrを標準入力が閉じて。


3
悲しいかな、detach私のディストリビューションには存在しないようです。nohupプロセスを起動しますが、それでも端末ウィンドウを占有します。
ニックトムリン

detach私のディストリビューションにもありません。しかし、PythonはURLのオープンとデタッチを処理できますpython -m webbrowser -t "http://example.com"。これは、ほとんどすべての最近のLinuxディストリビューションですぐに使用できるはずです。
クレッツ

けれどもdetachさえAURではありませんが、それはソースからインストールするのは簡単証明し、さらに私が望んで達成プログラムだけでした。(ここおよびdetachWebサイトにリストされている代替手段xdg-openは、実行中はシェルを閉じることを許可しません。または、少なくともdetach私のシェルが少し不平を言うことはありませんでした)
rien333

4

xdg-openプログラムが終了するのを待ちます。これは仕様です。プログラムがテキストモードプログラムである場合、ターミナルのフォアグラウンドに留まる必要があります。プログラムがGUIである場合でも、この動作はxdg-openスクリプトから使用され、スクリプトがファイルの編集後に何かを実行したい場合に役立ちます(たとえば、新しいバージョンをどこかに送信するか、新しいバージョンで何かを作成します)。

待ちたくない場合xdg-openは、バックグラウンドで実行します。最後にアンパサンドを付けることにより、バックグラウンドでシェルコマンドを実行できます。

xdg-open http://www.google.com &

一部のプログラムでxdg-openは、すぐに戻ります。実際に発生するのは、xdg-open呼び出すプログラムがすぐに戻ることです。これは通常、すべてのファイルを単一のインスタンスで開くGUIプログラムで発生します。2回目に起動すると、実行中のインスタンスにメッセージを送信して、ファイルを開いてすぐに終了するよう指示します。


そのようなアプリケーションはどのようにシングルインスタンスポリシーを実装しますか?DBusは私が知っている1つの方法ですが、これを実装する「xdg」方法はありますか?
PnotNP

@NulledPointer Lockファイル、X11ウィンドウメッセージ、D-Bus、…D-Busは「標準」のFreedesktopの方法だと思いますが、これに正式な仕様があるかどうかはわかりません。
ジル 'SO-悪であるのをやめる'

2
Ubuntu 16.04システムでは、xdg-openは常にすぐに戻ります。現在のアプリケーションでは、実際にはブロックすることを好みます。「xdg-openはプログラムが終了するのを待ちます。これは仕様です。」情報はどこから来ますか?
チャールボサ

@CharlBotha xdg-openはすぐに戻ります(Ubuntu 16.04では確認できます)が、それが呼び出すプログラムはバックグラウンドに移動する場合があります。たとえば、私のシステムでxdg-openは、PDFファイルのEvinceを呼び出します。PDFが既に開いている場合を除きevince foo.pdf、PDFファイルを閉じるまでブロックします。PDFが既に開いている場合、2番目のプロセスは既存のインスタンスをフォーカスして終了します。プログラムに実行中のプロセスを保持させる方法がない限り、それを制御することはできません。evincexdg-openxdg-open
ジル 'SO-悪であるのをやめる'

@Gillesチャール・ボサを誤解したと思う。あなたの答えは、「xdg-openはプログラムが終了するのを待ちます。これは仕様によるものです。」と述べています。しかし、あなたのコメントは「xdg-openはすぐに戻る」と言っています...これは矛盾しています。
cheshirekow

1

terdonの答えDan D.の議論をnohup組み合わせることで、私が望むものを正確に実行する関数を作成しました。

  1. なし選択したアプリでファイルを開きます任意の全ての端末への書き込み。
  2. 端末ウィンドウを閉じることができるようにプロセスを切り離します。
  3. アプリが生成するエラーを端末に書き込みません。

これを.bashrc/.zshrcファイルに追加しました:

function open () {
  nohup xdg-open "$*" > /dev/null 2>&1
}

の説明については、隠蔽隠蔽に関するこの議論/dev/null 2>&1参照してください。stdoutstderr


0

これを試して:

DISPLAY=:0.0; xdg-open '<url>'

この手法を使用して、magnet:// URLをBit TorrentクライアントVuzeにキューイングします。

ssh someserver "DISPLAY=:0.0; xdg-open 'http://www.google.com/'"

単一引用符は、シェルがURLの解釈を試行しないように、URLのコンテンツを保護するのに役立ちます。


これにより、現在のターミナルウィンドウでプロセスが実行されたままになります。質問を明確にする必要がある場合はお知らせください。
ニックトムリン

ええ、すぐに背景に戻したい場合は、アンパサンド「&」で背景に配置してください。@terdonの答えはそうではないですか?
slm

ここでの問題はxdg-openではなく、@ Gillesの回答を参照してください。彼は、xdg-openが保留されている理由を説明しています。
slm

どのブラウザにURLを送信していますか?URL w /を送信するときに、ダイアログボックスまたは他の何かがポップされますxdg-openか?ここの回答者のいくつかは、通常の動作は、一定期間後に端末に制御が戻されることを示しているようです。
slm

説明をありがとう。回答を確認しましたが、今ではこれをよく理解しています。ブラウザはiceweasalです。
ニックトムリン

0

コマンドライン(ループ)からWebページを開く必要がある場合は、スクリプトを開始する前にブラウザーを開くだけです。

この場合、最初のリンクの後にブラウザが閉じられるのを待たずに、すべてを新しいタブで開きます。


0

今日のように、これらのオプションはどれも私にとってはうまくいきませんでした。OPが「use xdg-open」と言ったことを完全に承知しています。事前に申し訳ありません。

私はデッドシンプルなことをしましたchrome https://google.es --new-window || chromium https://google.es --new-window || firefox https://google.es

これらの3つのブラウザをお持ちでない場合は、ご希望の順序で適切なブラウザを使用してください。

注:Firefoxは何も追加せずに新しいウィンドウを開きました。ケースはあなたのためにうまく機能しません、使用してくださいfirefox https://google.es -new-instance -new-window。これは-、Firefoxフラグの1つにすぎないことに注意してください。


0

disownはこのための正しいコマンドです。

読みやすくするために、2つの関数を使用します。

f_x()
{
   xdg-open "$1" &
   disown
}

x()
{
   f_x "$*" > /dev/null 2>&1
}

別の関数を呼び出す関数は、3行の長さの単一の関数よりも読みやすく、理解しやすいと思いますか?
G-Manが「Reinstate Monica」と言う

disownエラーが端末に送信されるのを防ぎません。
ロンドンロブ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.