web-dev-qa-db-ja.com

xbindkeysを使用して開始されるスクリプトを使用してグローバル環境変数を変更しますか?

TLDR:

  • 現在の値に応じて、環境変数を値fooからbarに、またはその逆に反転する単純なシェルスクリプトがあります。
  • 私が使う F12 このスクリプトをトリガーすると、動作することがわかります。
  • スクリプトがトリガーされると、スクリプトが終了しても新しい値は保持されません。

何が悪いのですか?

詳細:

1。スクリプト:

私のスクリプトは、環境変数が存在するかどうかを確認し、存在しない場合は作成します。
if [ -z $COLEMAK ];then export COLEMAK="qwerty";fi

次に、スクリプトは値を元の値から他の値に切り替えます。
if [ "$COLEMAK" == "qwerty" ] then export COLEMAK="colemak" ; xmodmap ~/colemak.map else export COLEMAK="qwerty" ; xmodmap ~/qwerty.map fi

変数値を反転するだけでなく、スクリプトはxmodmapを使用して、キーボードをあるレイアウトから別のレイアウトに再マップします。これがスクリプトの中心的な目的です。そのため、ファンクションキーからスクリプトをトリガーします。

このスクリプトは、それがソース(. ~/foo.sh)である場合にのみ機能し、仮想端末からは適切に機能することを知っています。ここまでは順調ですね。

2。 xbindkeys:

.xbindkeysrc.scm(xbindkey '(F12) "term &")を含めるように設定しました。 F12。ここまでは順調ですね。

(xbindkey '(F12) ". ~/foo.sh &")を読み取るようにその行を変更しました。押すとログ行が書き込まれるので、スクリプトが実行されることを知っています。 F12ただし、スクリプトの終了後、環境変数の変更は保持されません。

これが予想される動作です。プログラムは、それ自体とその子プロセスに対してのみ環境変数を設定できます。

あなたのケースでは、現在の状態をファイル(~/.active-modemapなど)に保存し、そのファイルのコンテンツを操作することができます。または、xmodmap -pkeの出力(またはmodemapのその他の出力)を(grepなどで)確認することで、現在使用されているモードマップを取得できる場合があります。

1
Ralf