私はCでミニシェルを作成しています。私は、環境変数を考慮しているところです。ユーザーから元の入力行を取得し、それを関数に渡します。
int expand(char *orig, char *new, int newsize)
ここで、newは固定長のchar配列です。$ {が見つかるまでorigをループし、getenvを使用して変数の値を見つけます。実際に値がある場合は、それをnewにコピーするだけです。ただし、値がなく、getenvがnullを返すと、問題が発生します。
私の先生は私にヌル文字を挿入するように言ったが、これは私には意味がなく、彼は別の意味を持っていたと思う。ヌル文字をorigに挿入する場合、それを引数に解析すると、ヌル文字が文字列の終わりを示していると見なされ、それ以上の引数を探す必要はありません。
たとえば、次のようなセッションに参加した場合:
echo ${USER} ${NOTHING} ${TERM}
それで:
orig = "echo ${USER} ${NOTHING} ${TERM}\0"
と
new = "echo my_user_name \0 xterm\0"
出力は次のようになります。
my_user_name
my_user_nameが最後の引数であると見なされるため、xtermを引数リストに読み込む前にnullターミネータがあることを確認します。
これは漠然とした質問ですが、ミニシェルの作成にかなりの経験があり、この問題が通常どのように対処されるかを知っている人もいると思います。