どのファイルに変数定義が含まれているかどうかはどうすればわかりますか?

どのファイルに変数定義が含まれているかどうかはどうすればわかりますか?

私のOSでは:

echo $CLUTTER_IM_MODULE
fcitx5

どのファイルに変数定義が含まれているかどうかはどうすればわかりますか?
.bashrcまたは/etc/bash.bashでenvを定義できることを知っています。
文字列を含むファイルを取得するには時間がかかりますCLUTTER_IM_MODULE

sudo grep  -r  CLUTTER_IM_MODULE  /

目標を達成するための賢明な方法はありますか?

ベストアンサー1

変数がシェルプロファイルスクリプトで定義されていると確信している場合そしてlocate拡張正規表現と NUL で区切られた出力 (mlocateまたは ) をサポートするバージョンがある場合は、plocate次のように実行できます (実行よりもはるかに高速ですgrep -r)。

locate -0 --regex '/(\.(bash_)?profile|(bash)?\.?bashrc|etc/profile.d/|etc/environment$)' |
  xargs -0r grep -H '[^$]CLUTTER_IM_MODULE='

メモ:

  1. grep オプションは、-Hファイル名が 1 つだけ返されても、ファイル名が常に出力と一致することを保証しますlocate(可能性は低いですが、-H を使用しても何の害もありません)。

  2. 大文字と小文字を区別しない一致には、grepオプションを使用することもできます-i

  3. シェルプロファイルスクリプトが異なる場所で見つかった場合や異なる名前を持つことができる場合は、正規表現を適切に調整する必要があります。たとえば、私の元の正規表現には、検索機能(一部のシステムでシェル変数を定義できる別の場所)がなかった/etc/environmentため、これを追加しました。

  4. これは変数がどのファイルであるかを教えてくれません。以前は実際に定義されている場合は、ファイルのみを表示できます。可能変数の現在の値を担当します(どの変数が実際に実行されたのかわからず、変数がスクリプトに設定されていることだけがわかります)。

  5. locateデータベースは通常、1 日に 1 回だけ更新されます。最後の実行以降にプロファイルスクリプトが生成された場合、ファイルは見つかりません。

  6. ファイル権限によっては、次のコマンドを実行する必要があります。

    sudo locate ... | xargs -0r sudo grep -H
    

おすすめ記事