私はlxdm(fluxboxとxfceを使用していた)を試すことにし、多くのプログラムでurlハンドラーが失敗してこのエラーメッセージが生成されることを発見しました。
ご覧のとおり、奇妙なことに、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
@ 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
_行を理解する方法は次のとおりです。
pcmanfm
が実行可能かどうかをテストします(独自のヘルプを報告し、STDOUTまたはSTDERRを破棄します)。is_file_url_or_path()
を実行して、_"$1"
_引数がpcmanfm
に受け入れられるかどうかを確認します(上記のコードコメントに従って)これらの両方の条件が満たされている場合、スクリプトは次の短いブロックに流れ込みます。
file_url_to_path()
を呼び出して、先頭の「file://」部分を削除します(ローカル変数file
として)file
の値の前に追加します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つの問題があります。
else .. fi
_部分)。これは、意図されたプロセスチェーンが実際には単一のプロセスのみであるため、(ほとんど)常に_if .. ;
_条件として「偽」と見なされるシェルリダイレクトエラーが生成されるためです。これはsoooo悪いことではありません。その_else .. fi
_ブロックは、パスとファイルを処理するように設計されたopen_generic()
と呼ばれる別のスクリプト関数への動作を単に延期するためです。 URL(ただし、pcmanfm
を使用せずに作業を行う。むしろ、私が分析しなかったが、公平な仕事をしていると思われる他のいくつかの複雑なコードパス)。 しかし待って! [〜#〜]ホラー[〜#〜]...pcmanfm --help ...
_拡張スクリプト行を振り返ってください。 STDERRのリダイレクトに注意してください。これが「/ home/user/precious」のような正当なパスで行われた場合にどうなるかを考えてください。 [〜#〜] omg [〜#〜]pcmanfm
が利用可能で、引数がファイルかどうかをテストするだけですファイルを上書き!!!バイバイプレシャス...これは、Debian 10 (buster)
、LXDE
、xdg-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
は$
に置き換える必要があります)
Debian 10(バスター)、LXDE、xdg-utils 1.1.3-1で確認済み。バグのように見えますか?編集を必要としない1つのオプション/usr/bin/xdg-open
:
XDG_CURRENT_DESKTOP=gnome xdg-open https://www.google.com
彼が一時的に機能する安達誠司の修正はうまく機能します https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=906766