From: haruka@... Date: 2018-12-24T23:55:38+09:00 Subject: [ruby-list:50723] Re: ENV / ARGV でNULL文字で終わってしまう 神戸さん、ご回答ありがとうございます。 成る程、プロセス置き換え時に既に失われてしまっているのですね… 確かに zsh -c 'print -r "$param"' でも消えました。 おとなしくnul文字を含まない方法を考えようと思います。 失礼しました。 ありがとうございました。 2018.12.24 23:42 に Takahiro Kambe が書きました: > In message <69e9b6d34f923668447fa88545c8b984@reasonset.org> > on Mon, 24 Dec 2018 23:32:18 +0900, > haruka@reasonset.org wrote: >> 環境変数(ENV)または引数(ARGV)でNULL文字を含む文字列を渡すと、 >> Ruby側ではNULL文字で終端したものとして扱われてしまいます。 > 「NULL文字」は nul文字 ('\0')のことと思いますが、UNIX系OSの場合は > execve(2)でプロセスを置き換える際に第3引数で文字列のポインタの配列とし > て渡します。 > > int execve(const char *path, char *const argv[], char *const envp[]); > > 置き換えられた後のプログラムでは、 > > int main(int argc, char *argv[], char *envp[]); > > とmain関数の引数か、広域変数 > > extern char **environ; > > として参照できます。envpやenvironの文字列ポインターの配列で参照してい > る文字列は'\0'で終端されたC言語の文字列ですので、そもそも途中に'\0'を > 含めること自体できないと思いますが、如何でしょうか? > > どうしても'\0'を含めたい場合は何かエンコードしておくしかないと思います。