Re: [Q]引数指定でも標準入力でも同様 の動作をさせたい場合
shirai@unixusers.net (Takashi SHIRAI) writes:
>> $ cat hoge
>> 1 2 3 4 5
>> 6 7 8 9 0
>> 6 7 8\ 9 0
>>
>> だったとき、中間回答の方法では出力結果が
>>
>> 1 2 3 4 5
>> 6 7 8 9 0
>> 6 7 8 9 0
>>
>> になっちゃいます。これの回避策をまだ探し中なのです。
>
> これは bash の特性ですね。ash や Bourne shell だと「\」は
> 保持されます。これは bash が 2-pass で parsing しているから
> で、echo を外部コマンドに差替えても引数に「\」が渡っていない
> ことが確認出来ると思います。
> zsh や ksh も「\」を落としますね。この辺りは source を読ん
> だことがないので理由は知りません。command line 処理の時点で
> はなく read 自体が落としているのかも知れません。
read した直後に、引数なし set コマンドでシェル変数を表示してみると
その時点で \ が消えてます(bash in linux)。
> read のせいと言えば、行頭と行末の IFS を落としてしまうのは
> read の仕様ですね。なので、echo の側だけ細工しても IFS 対策
> には不十分です。
IFS対策と言えるかどうかわかりませんが read の前に IFS= すれば
行をそのまま読めますよね。
他には、上記サンプルのような「shスクリプトとして見て文法的に
エラーで無い場合」は sh -nv hoge で \ もそのまま表示されます。
表示してみないと表示できるかどうかわからないのが難点。
--
tksotn
Fnews-brouse 1.9(20180406) -- by Mizuno, MWE <mwe@ccsf.jp>
GnuPG Key ID = ECC8A735
GnuPG Key fingerprint = 9BE6 B9E9 55A5 A499 CD51 946E 9BDC 7870 ECC8 A735