Re: Fixing filenames in JIS (MIME iso-2022-jp) / JISのファイル名
しらいです。
In article <4108B8F7.24CF98D0@ht.sakura.ne.jp>,
IIJIMA Hiromitsu <delmonta@ht.sakura.ne.jp> wrote:
>いいじまです。shells 送り。
元の話が見えないので微視的な話になりますが。
>> > '$f' とシングルクォートでくくってはいけませんね _| ̄|○
>> > mv "$f" "`echo '$f' | nkf -mJwx`"
>>
>> "` `"の中の$fは' '囲みでいいのかな? …と思ってやってみると、bashでは
>> だめだけど、cshだと一応大丈夫なんですね。
>
>\"$f\" というのを手元の FreeBSD で試したんですが、それがどうも上手くいか
>ないようなので、苦肉の策で ' ' にしました。` ` の存在を無視して $f を展開
>して、それから ` ` の中身を実行するようです。
sh 系 shell で "" の中に `` を入れ子に出来るようになったの
は確か SystemV の ksh からで、Ken Thompson 版 sh 及び Bourne
shell ではそもそも "" の中で `` は meta cheracter ではありま
せん。
一方、"" の中に `` を入れ子に出来る shell、具体的には ksh,
ash, bash, zsh では、内側の `` の中では外側の "" の存在が無
かったことになりますから、その中に "" を更に記述出来ます。
なので、Ken Thompson 版 sh と Bourne shell 以外の sh 系で
は「"$f"」で済む筈ですが。
# 因みに fdsh は Bourne shell clone にしてあるので `` 自体
#展開しません。この 7 種類以外の sh 系 shell をご存知の方が
#いたら、挙動を確認してみて下さい。
csh や tcsh は詳しくないので幾つかの実装で実際に試してみた
ところ、どの実装でも通常は「"$f"」で済みますが、$f が IFS の
空文字やタブを含んでいると `` が一致しないと言われます。
やはり先に "" と $ の処理をしてしまってから `` を処理する
という 2-pass なんでしょうかね。1-pass で parse しないと色々
弊害があるんですけど。escape が面倒そう。
>ファイル名に " や \ が入っている可能性はほぼ考えなくていいので、sh 系の
>ほうが無難ですね。そもそも csh 系でスクリプトは一切書くな、と主張する人
>も世の中にはいらっしゃいますし。
そんなこと言うのなら、IFS である空文字やタブが含まれている
可能性だってほぼ考えなくていいので「$f」で十分だってことにな
りますよ。
それではうまくいかないから quoting するという話が出て来た
のではないんでしょうか。もしそうなのなら、他の meta character
に関する配慮も必要になろうかと思います。
--
しらい たかし
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