web-dev-qa-db-ja.com

debian 9のxdg-openがブラウザを開けない

私はlxdm(fluxboxとxfceを使用していた)を試すことにし、多くのプログラムでurlハンドラーが失敗してこのエラーメッセージが生成されることを発見しました。 error message

ご覧のとおり、奇妙なことに、URLの前にユーザーディレクトリを追加しています。ここでの例は電報ですが、コマンドラインから実行する場合と同様に、不一致で発生します。 xdg-open https://www.google.comでも同様のエラーが発生します。 xdg-settings get default-web-browser出力のfirefox.desktopは、xfceとlxdmの両方でリンクとして機能します。詳しくは;その上でbash -xを実行しました...

$ bash -x /usr/bin/xdg-open http://www.google.com
+ check_common_commands http://www.google.com
+ '[' 1 -gt 0 ']'
+ parm=http://www.google.com
+ shift
+ case "$parm" in
+ '[' 0 -gt 0 ']'
+ '[' -z '' ']'
+ unset XDG_UTILS_DEBUG_LEVEL
+ '[' 0 -lt 1 ']'
+ xdg_redirect_output=' > /dev/null 2> /dev/null'
+ '[' xhttp://www.google.com '!=' x ']'
+ url=
+ '[' 1 -gt 0 ']'
+ parm=http://www.google.com
+ shift
+ case "$parm" in
+ '[' -n '' ']'
+ url=http://www.google.com
+ '[' 0 -gt 0 ']'
+ '[' -z http://www.google.com ']'
+ detectDE
+ unset GREP_OPTIONS
+ '[' -n LXDE ']'
+ case "${XDG_CURRENT_DESKTOP}" in
+ DE=lxde
+ '[' xlxde = x ']'
+ '[' xlxde = x ']'
+ '[' xlxde = x ']'
+ '[' xlxde = xgnome ']'
+ '[' -f /run/user/1000/flatpak-info ']'
+ '[' xlxde = x ']'
+ DEBUG 2 'Selected DE lxde'
+ '[' -z '' ']'
+ return 0
+ case "${BROWSER}" in
+ case "$DE" in
+ open_lxde http://www.google.com
+ pcmanfm --help -a is_file_url_or_path http://www.google.com
++ file_url_to_path http://www.google.com
++ local file=http://www.google.com
++ echo http://www.google.com
++ grep -q '^file:///'
++ echo http://www.google.com
+ local file=http://www.google.com
+ echo http://www.google.com
+ grep -q '^/'
++ pwd
+ file=/home/nesmerrill/.local/share/applications/http://www.google.com
+ pcmanfm /home/nesmerrill/.local/share/applications/http://www.google.com
+ '[' 0 -eq 0 ']'
+ exit_success
+ '[' 0 -gt 0 ']'
+ exit 0

重要な部分はpcmanfm --help -a is_file_url_or_path http://www.google.comのようですが、このコマンドを使用した場合、そのコマンドは何もしません。

$ pcmanfm --help -a is_file_url_or_path http://www.google.com
Usage:
  pcmanfm [OPTION…] [FILE1, FILE2,...]  

Help Options:
  -h, --help                   Show help options
  --help-all                   Show all help options
  --help-gtk                   Show GTK+ Options

Application Options:
  -p, --profile=PROFILE        Name of configuration profile
  -d, --daemon-mode            Run PCManFM as a daemon
  --no-desktop                 No function. Just to be compatible with nautilus
  --desktop                    Launch desktop manager
  --desktop-off                Turn off desktop manager if it's running
  --desktop-pref               Open desktop preference dialog
  --one-screen                 Use --desktop option only for one screen
  -w, --set-wallpaper=FILE     Set desktop wallpaper from image FILE
  --wallpaper-mode=MODE        Set mode of desktop wallpaper. MODE=(color|stretch|fit|crop|center|tile|screen)
  --show-pref=N                Open Preferences dialog on the page N
  -n, --new-win                Open new window
  -f, --find-files             Open a Find Files window
  --role=ROLE                  Window role for usage by window manager
  --display=DISPLAY            X display to use
5
Evil Spork

@ user310685は近づきました-しかし間違いなく間違っています。この修正は、「ネイキッド」ファイルパスが指定されている場合(つまり、先頭に「file:」がない場合に_xdg-open_が[〜#〜]でない場合にのみ機能します。 // "URIスキームとダブルスラッシュ)またはファイル形式のURI(つまり、先頭に" file:// "が付いています)。これら2つのタイプの引数は_xdg-open_がpcmanfmに遅延する必要がありますが、そうではありません。

実際のエラーは、STDERRリダイレクトの誤りではありません。むしろ、スクリプト作成者がtestの「and」演算子とシェルのプロセスリストの「and」コネクタを混同したためです。 (誤って)使用されたものは「-a」です。正しいものは「&&」です。

参考までに、元のスクリプト行とその修正、および@ user310685による「ホラーオブホラー」の提案を再現しました。

_#ORIG#   if pcmanfm --help >/dev/null 2>&1 -a is_file_url_or_path "$1"; then
#FIXED#  if pcmanfm --help >/dev/null 2>&1 && is_file_url_or_path "$1"; then
#HORROR# if pcmanfm --help >/dev/null 2>$1 -a is_file_url_or_path "$1"; then
_

_if ..; then_の意図は、そのすぐ上のスクリプト行に示されています。

_# pcmanfm only knows how to handle file:// urls and filepaths, it seems.
_

このコメントを念頭に置いて、問題のある_if .. then_行を理解する方法は次のとおりです。

  1. pcmanfmが実行可能かどうかをテストします(独自のヘルプを報告し、STDOUTまたはSTDERRを破棄します)。
  2. さらに、スクリプト関数is_file_url_or_path()を実行して、_"$1"_引数がpcmanfmに受け入れられるかどうかを確認します(上記のコードコメントに従って)

これらの両方の条件が満たされている場合、スクリプトは次の短いブロックに流れ込みます。

  1. スクリプト関数file_url_to_path()を呼び出して、先頭の「file://」部分を削除します(ローカル変数fileとして)
  2. 結果が絶対パスでない場合(つまり、「/」で始まっていない場合)、CWDをfileの値の前に追加します
  3. _pcmanfm "$file"_を実行します

元のスクリプトが失敗する理由:

上記のように、スクリプトは(誤って)「-a」を「プロセスリストand演算子」として使用しています。実際に起こることは、シェルがコマンドを実行することです(STDOUTおよびSTDERRリダイレクトがコマンドから「引き出された」後、最初のワードの後のコマンドワードシーケンスのどこにでも許可されます)。

_pcmanfm --help -a is_file_url_or_path "$1"
_

これは常に成功します(pcmanfmがPATHで実行可能でない場合を除く)。コマンドライン(_-a .._)の余分なものはすべて、pcmanfmが_--help_モードを実行すると無視されます。したがって、「ファイルまたはファイルURLとして処理」コードブロックは、常に実行されます。 URLが指定されている場合(スキーム部分を含む)、file_url_to_path()スクリプト関数は、先頭の "file://"のみを削除し、末尾の "#..."フラグメントを切り捨て、URIをデコードします引数(つまり、「%XX」はASCIIに変換されます)。注:引数が「file:///」で始まっていない限り、何も行われません。

たとえば、OPのURL " https://www.google.com "は、 "file:///"で始まっていないため、file_url_to_path()によって変更されません。 [〜#〜] but [〜#〜]その後、コードはこの引数をaと見なします「相対パス」は明らかに「/」で始まっていないため。したがって、説明されているようにCWDが前に付加され、pcmanfmは、ほとんどの場合、その変更された値を表示する現存のパスとして見つけません。代わりに、OPの質問のように、エラーポップアップが表示されます。

修正:

十分に単純です:上記の_#FIXED#_行に示されているように、プロセスチェーンAND演算子の正しい構文「&&」を使用します。

@ user310685の提案のホラー:

@ user310685が提案することは、1つの問題を修正します。何が起こるかと言うと、シェルは変数の展開を忠実に行い、次のようなものを実行しようとします。

_pcmanfm --help >/dev/null 2>https://www.google.com -a is_file_url_or_path https://www.google.com
_

これはほぼ確実にシェルリダイレクトエラーを生成します(CWDに「https:」という名前のフォルダーが(適切な場所に)ある場合を除きます-これはできます)。そのリダイレクトエラーはSTDERRにメッセージを吐き出し、シェルは次に進みます。このエラーは_if .. else .. fi_ブロック内で発生したため、シェルは_else .. fi_の部分を受け取ります。これは@ user310685が望んでいることです。したがって、問題は解決されます...

BUT AT WHAT COST ???

この正しくない修正には2つの問題があります。

  1. 実際にパスまたはファイル形式のURLを指定すると、間違ったコードパスが実行されます(_else .. fi_部分)。これは、意図されたプロセスチェーンが実際には単一のプロセスのみであるため、(ほとんど)常に_if .. ;_条件として「偽」と見なされるシェルリダイレクトエラーが生成されるためです。これはsoooo悪いことではありません。その_else .. fi_ブロックは、パスとファイルを処理するように設計されたopen_generic()と呼ばれる別のスクリプト関数への動作を単に延期するためです。 URL(ただし、pcmanfmを使用せずに作業を行う。むしろ、私が分析しなかったが、公平な仕事をしていると思われる他のいくつかの複雑なコードパス)。 しかし待って! [〜#〜]ホラー[〜#〜]...
  2. シェルが試行する_pcmanfm --help ..._拡張スクリプト行を振り返ってください。 STDERRのリダイレクトに注意してください。これが「/ home/user/precious」のような正当なパスで行われた場合にどうなるかを考えてください。 [〜#〜] omg [〜#〜]pcmanfmが利用可能で、引数がファイルかどうかをテストするだけですファイルを上書き!!!バイバイプレシャス...
6
Stevel

これは、Debian 10 (buster)LXDExdg-utils 1.1.3-1にも当てはまります。 xdg-openスクリプトにタイプミスがあり、解決策は次のとおりです。

    --- /usr/bin/xdg-open   2018-05-20 00:18:48.000000000 +0200
+++ /home/klaumi/bin/xdg-open   2018-09-13 15:15:51.630704599 +0200
@@ -928,7 +928,7 @@
 {

     # pcmanfm only knows how to handle file:// urls and filepaths, it seems.
-    if pcmanfm --help >/dev/null 2>&1 -a is_file_url_or_path "$1"; then
+    if pcmanfm --help >/dev/null 2>$1 -a is_file_url_or_path "$1"; then
         local file="$(file_url_to_path "$1")"

         # handle relative paths

&2>&1$に置き換える必要があります)

2
user310685

Debian 10(バスター)、LXDE、xdg-utils 1.1.3-1で確認済み。バグのように見えますか?編集を必要としない1つのオプション/usr/bin/xdg-open

  • 別のデスクトップ環境のハンドラーを使用するようにxdg-openに要求できます(ref 1 ):XDG_CURRENT_DESKTOP=gnome xdg-open https://www.google.com


1
helmingstay

彼が一時的に機能する安達誠司の修正はうまく機能します https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=906766

0
user149244