.desktopファイルと同じフォルダにあるシェルスクリプトを実行する.desktopファイルを作成しようとしています。これまで私は次のことをしました。
Exec=bash -xc 'cd "$(dirname %k)" && bash ./patch.sh && bash -c "read -n1"'
このコマンドには2つの問題しかありません。最初の問題は、desktop-file-validate
いくつかのエラーが返されることです。
start.desktop: error: value "bash -xc 'cd "$(dirname %k)" && bash ./patch.sh && bash -c "read -n1"'" for key "Exec" in group "Desktop Entry" contains a reserved character ''' outside of a quote
start.desktop: error: value "bash -xc 'cd "$(dirname %k)" && bash ./patch.sh && bash -c "read -n1"'" for key "Exec" in group "Desktop Entry" contains a non-escaped character '$' in a quote, but it should be escaped with two backslashes ("\\$")
start.desktop: error: value "bash -xc 'cd "$(dirname %k)" && bash ./patch.sh && bash -c "read -n1"'" for key "Exec" in group "Desktop Entry" contains a reserved character '&' outside of a quote
start.desktop: error: value "bash -xc 'cd "$(dirname %k)" && bash ./patch.sh && bash -c "read -n1"'" for key "Exec" in group "Desktop Entry" contains a reserved character '&' outside of a quote
start.desktop: error: value "bash -xc 'cd "$(dirname %k)" && bash ./patch.sh && bash -c "read -n1"'" for key "Exec" in group "Desktop Entry" contains a reserved character '&' outside of a quote
start.desktop: error: value "bash -xc 'cd "$(dirname %k)" && bash ./patch.sh && bash -c "read -n1"'" for key "Exec" in group "Desktop Entry" contains a reserved character '&' outside of a quote
start.desktop: error: value "bash -xc 'cd "$(dirname %k)" && bash ./patch.sh && bash -c "read -n1"'" for key "Exec" in group "Desktop Entry" contains a reserved character ''' outside of a quote
私はこれをまったく理解していません。完全な「bash」パラメータの周囲に一重引用符があり、その中のすべての項目に二重引用符があります。デスクトップファイルは機能し、bashコマンド自体も機能します(デスクトップファイルの外で実行されたとき)。それでは、この確認ツールが引用符の欠落について文句を言うのはなぜですか?なぜ&&
スクリプトからエスケープするのですか?
2番目の問題は、パスにスペースが含まれているとデスクトップファイルが機能しないことです。私はこれがバリデータが私に与えるすべてのエラーと関係があると思います。
しかし、私はエラーが消えるようにこれを適切にエスケープする方法を知りません。すでに一重引用符で囲まれていることを避けることは言葉ではありません&&
。そうですか?
答え1
私はこれを理解していない
エラーを注意深く読み取ると、エラーを次のように減らすことができます。
error: value "bash -xc '...'" contains a reserved character ' outside of a quote
'
最初に参照しないと利用できないことがわかります。 1つのオプションは、すべての項目に二重引用符を付けることです。この場合、内部二重引用符をエスケープする必要があるかもしれません。別のオプションは、一重引用符をエスケープして、特殊演算子ではなく行の一部と見なすことです。
私は次のいずれかがうまくいくと思います。
Exec=bash -xc \'cd \"\$(dirname %k)\" \&\& bash ./patch.sh \&\& bash -c \"read -n1\"\'
Exec="bash -xc 'cd \"$(dirname %k)\" \&& bash ./patch.sh && bash -c \"read -n1\"'"
&&
なぜスクリプトからエスケープするのですか?
&&
bash 演算子です。この行を解析するものは何でも bash ではありません。代わりに、行を取得して前処理し(ユーザーがアプリに通知したい特定のものを検索し)、残りにタグを付けてから最初のタグでプロセスを開始し、残りをパラメータ転送に渡すことができます。固有の特別な規則と構文がある可能性があります。
答え2
より仕様。複雑です。予約された文字(非常に長いリスト)を使用してパラメータを引用する必要がありますが、二重引用符のみを使用してください。。したがって、あなたのコマンドは実際には'cd
2番目の引数として渡されますbash
。また、&&
二重引用符内にないため、エラーが発生します。
私はgnomeを使用していないのでこれをテストすることはできませんが、仕様では"`\$
文字列内の文字をエスケープする必要があることが示されています(たとえば、フィールドコードを使用したくない場合はエスケープする必要があります)。%
次%%
のようなことを試してください
bash -xc "cd \"\\$(dirname %k)\" && bash ./patch.sh && bash -c \"read -n1\""
この仕様は、具体的で重要ないくつかの例を提供できます。