すべてのランチャー(* .desktop)を実行可能ファイルに設定する単純なBashスクリプトが機能しない

Mar 21 2019

私より賢い人が私を助けることができることを願っています...

デスクトップ(.desktop)ファイルのランチャーは、18.04(Bionic Beaver)へのアップグレードやウィンドウマネージャー(Gnome)の変更など、OSに大きな変更を加えるたびに、実行可能権限を失います。これらの変更後、ランチャーファイル(たとえば、audacity.desktop)によって提供される各アイコンをダブルクリックすると、アプリケーションを「信頼して起動する」ことを要求するメッセージポップアップが表示されます。開発しているもの(Webサイトのデザインと印刷されたデスクトップパブリッシングまたはマルチメディア編集とDVDの作成など)に基づいてデスクトップ上のさまざまなフォルダーにランチャーがたくさん整理されているため、非常に不便です。各アプリケーションを開く必要はありません。ランチャーから[信頼して起動]をクリックし、後で本当に必要なときに機能することを確認するために閉じます。したがって、〜Desktop /フォルダー自体から始めて、特定のフォルダー内のすべてのランチャーを処理する単純なBAShスクリプトを作成しましたが、奇妙な理由で、機能しません。これが機能しない私のプロダクションスクリプトです:

#!/bin/sh
for myDesktop in $HOME/Desktop/*.desktop do /usr/bin/gio set \"$myDesktop\" \"metadata::trusted\" "yes"
done

目的の結果ではなく、次のエラーが発生します。

gio: Too many arguments
Usage:
  gio set [OPTION…] LOCATION ATTRIBUTE VALUE...
Set a file attribute of LOCATION.
Options:
  -t, --type=TYPE             Type of the attribute
  -n, --nofollow-symlinks     Don’t follow symbolic links
[2]+  Done                    for myDesktop in $HOME/Desktop/*.desktop; do /usr/bin/gio set \"$myDesktop\" \"metadata::trusted\" "yes";
done

これは、エコーを使用して目的の出力を生成するシミュレーションスクリプトです。つまり、ランチャーごとの目的のコマンドは、実行されずに単純に出力されます。

#!/bin/sh
for myDesktop in $HOME/Desktop/*.desktop do echo /usr/bin/gio set \"$myDesktop\" \"metadata::trusted\" "yes"
done

シミュレーションで作成されたコマンドは、必要に応じて各ランチャーのすべてのコマンドを正しく出力します。次に例を示します。

/usr/bin/gio set "/home/bruce/Desktop/audacity.desktop" "metadata::trusted" yes

上記のコマンドをコピーして単独で実行すると、望ましい効果が得られます。この場合、audacityは「信頼して起動」として起動しますが、cliで各コマンドを実行する必要があるため、各ランチャーをダブルクリックするよりも便利ではありません。ランチャーアイコンをクリックし、[信頼して起動]をクリックします...正方形に戻ります!注:geditなどの一部のアプリケーションには、スペースを含む「Text Editor.desktop」などのランチャーがあるため、ファイル名は引用符で囲む必要があります。

各* .desktopランチャーで「TrustandLaunch」の正しいコマンドを出力するスクリプトを取得できる理由がわかりませんが、BAShは実際にそれらを実行することを拒否します(echoコマンドを削除した後)。私はこれまでそのようなものを見たことがなく、シミュレーションは機能しますが、実際のスクリプトは一貫して失敗します。

助けて!

前もって感謝します

回答

1 mchid Mar 21 2019 at 07:34

@noskloが指摘したように、円記号を削除すると機能します。

空白を含む可能性のある変数を定義するために使用される二重引用符の前に円記号は必要ありません。

さらに、echoコマンドに円記号が必要ですが、bashスクリプトに必要ありません

#!/bin/bash
for myDesktop in $HOME/Desktop/*.desktop do /usr/bin/gio set "$myDesktop" "metadata::trusted" "yes"
done

変更を確認するには、次のコマンドを実行します。

gio info ~/Desktop/*.desktop | grep -P 'metadata|uri'

空白を含むファイルには、最後のコマンドの出力の空白の代わりに「%20」が含まれます。

最後に、ログアウトしてから再度ログインして、変更を有効にします。


また、これらのファイルを実行可能ファイルとして設定するだけの場合はchmod、代わりに次のようなコマンドを使用できます。

#!/bin/bash
for i in ~/Desktop/*.desktop
do chmod +x "$i"
done

ただし、これによってファイルが「信頼」されることはありません。