新城@筑波大学情報です。こんにちは。

In article <emh0o6$8s4$1@antre.cala.muzik.gr.jp>
        shirai@unixusers.net (Takashi SHIRAI) writes:
>  しらいです。
>  Bourne shell の文法仕様ってそんなに難しいでしょうか?

難しい方でしょうね。JCL よりは簡単として。

>  Bourne shell 仕様に於いて、コマンド引数に含まれる改行は保
> 存されずに field separator として shell が評価してしまいます。
> これは eval のような内部コマンドでも同じです。

なるほど。eval がコマンドで、関数定義は、コマンドではない、
という所に難しさがあるのね。

> echo_xy() { echo "$x,$y" }
> ------------------------------------------------------------
>  見て判る通り、「;」が足りないので文法エラーになりますね。
> 「{}」の中身は必ず「;」か改行で終わっていけないというのが文
> 法仕様ですから。

う。それは、難しい。

>  ついでに言うと、「``」の中では「\」も評価されて消えてしま
> うので、期待した結果を得るにはもう一個「\」が必要です。

それは、記事を書いた後で、そうかなと思いました。

>  という訳で、以下のように記述すればうまくいく筈です。

うまく行きました。ありがとうございます。

>  このように、Bourne shell に於いて改行は完全に「;」の代替と
> なる訳ではないので、1 liner でなくても「;」を使うように習慣
> づけておくといいんじゃないでしょうか。

なるほど。これは、生活の知恵ですね。

あとは、eval はやめて、source にするか。source は、行は普通
だから。

------------------------------------------------------------
$ x="file1 file2"
$ y="10 20"
$ cat > /tmp/tmp-$$ <<EOF
> echo_xy()
> {
> echo "$x,\$y"
> }
> EOF
$ cat /tmp/tmp-$$
echo_xy()
{
echo "file1 file2,$y"
}
$ source /tmp/tmp-$$
$ rm /tmp/tmp-$$
$ x="file3 file4"
$ y="30 40"
$ echo_xy
file1 file2,30 40
$ 
------------------------------------------------------------
と、できました。

でも、source だと、rm しないといけないし、そもそもテンポラリ・
ファイルを安全に作成するのが、今の時代、難しくなっているとい
う所が今一つです。

まだまだ改善の余地がありますね。

もしかして、、、と思ったら、失敗しました。
------------------------------------------------------------
$ source /dev/tty
bash: source: /dev/tty: not a regular file
$ 
------------------------------------------------------------

昔、C のプログラムで #include </dev/tty> というプログラムが
何かでウケたんだけど、何でしたっけ?

\\ 新城 靖 (しんじょう やすし) \\
\\ 筑波大学 電子・情報       \\