本を読む

読書やコンピュータなどに関するメモ

bashは環境変数をどう管理しているか

 質問自体は識者の方々が答えているので略として、bashが環境変数をどう管理しているかについて私がコメントした内容を改めてまとめておきます。

  • bashは起動時に、環境変数の内容から、グローバル変数shell_variablesで指すハッシュ表を作る
  • 以後はシ‌​ェル変数(環境変数を含む)はそのハッシュ表で管理する
  • exportを実行すると、そのハッシュ表のエントリーにatt_exported属性が付く
  • それと並行して、グローバル変数export_e‌​nvが管理されている
  • 外部コマンドの実行時などに、export_envの内容が、shell_variablesをもとに更新される
  • execveシステムコールには、このexport_envが渡さ‌れる

試す

 「Big Sky :: 別のプロセスの動的な環境変数を盗み取る」のスクリプトを、bashに特化してちょっと変更して、試してみます。基本的には対象をexport_envに変えただけです(あとヒアドキュメントのクォートと、/bin/sh対応)。

#!/bin/sh
if [ "x$2" = "x" ]; then
  GREP=cat
else
  GREP="grep ^$2="
fi

gdb -q --silent -p $1 <<'EOF' | grep XXXXXXX | cut -c9- | $GREP
set $i=0
while (1)
  set $r=*((char**)export_env+$i)
  if ($r == 0)
    loop_break
  end
  printf "\nXXXXXXX %s\n", $r
  set $i++
end
EOF

 まずexportを実行しただけの状態でスクリプトを実行しても、何も表示されません。

bashは環境変数をどう管理しているか:実験1

 なにか外部コマンドを実行した後でスクリプトを実行すると、環境変数が表示されます。

bashは環境変数をどう管理しているか:実験2

コメント

コメントの投稿

管理者にだけ表示を許可する

トラックバック

http://emasaka.blog65.fc2.com/tb.php/1317-8e9c26c8

 | HOME | 

Categories

Recent Entries

Recent Comments

Recent Trackbacks

Appendix

emasaka

emasaka

フリーター。
連絡先はこのへん

Monthly


FC2Ad