bashでグローバル変数を子プロセスにエクスポートする方法

bashでグローバル変数を子プロセスにエクスポートする方法

私はOpenboxウィンドウマネージャでArchとbashを使用しています。
すべてが最新の状態です。
Openboxは次のように構成されています。rc.xml

内部的には、通常、必要な一連の便利なコマンドをショートカットに接続するためrc.xmlに呼び出します。bash -c 'command1; command2; etc'

rc.xml次のように定義されたショートカットがあります

<keybind key="1"><action name="Execute"><command>bash -c '
command1;
command2;
etc;
yad --timeout=1 --text="$pos_x x $pos_y";
'</command></action></keybind>

$pos_xグローバルに定義されて表示されない変数を除いて、すべてが期待どおりに機能し、完全に機能します$pos_y

これは.bashrc次のように定義されます。

export pos_x=1000  
export pos_y=500  

新しいbashシェルターミナルウィンドウを開いて入力すると、予想される1000 x 500が
echo "$pos_x x $pos_y"
表示されます。

ただし、この新しい端末ウィンドウに入力すると、 bash -c 'echo "$pos_x x $pos_y"'
子プロセスはグローバル変数を継承しないため、何も表示されません。

入力すると bash -c 'source ~/.bashrc; echo "$pos_x x $pos_y"'
何も表示されないため、子プロセスから.bashrcをインポートすることは役に立ちません。

定義されたグローバル変数を.bashrc子プロセスに渡すには?

私は周りを見回したが、答えが見つかりませんでした。

ベストアンサー1

Archのデフォルト設定には、~/.bashrcファイルの上部に次の行が含まれています。

# If not running interactively, don't do anything
[[ $- != *i* ]] && return

これにより、非対話型シェルはその行からファイルの読み取りを停止します。bash -c非対話型シェルが起動されるため、ファイル~/.bashrc全体を読み取ることができないため、変数は定義されません。

したがって、次のことを試すことができます。

  1. ~/.profile代わりに変数を入れてください~/.bashrc。とにかく、これはグローバル変数の自然な場所です。ログイン管理者がこの内容を読む限り、/.profile機能します。

  2. 別のファイルを使用してください。そこに変数定義を入れる必要はありません~/.bashrc。変数定義を入れて~/fooからコマンドを実行するだけですbash -c '. ~/foo; echo "$pos_x x $pos_y"

  3. 読み取りを停止する最初の部分に表示された行の上に変数定義を配置します~/.bashrc

おすすめ記事