Re: Variable expansion at definition time
新城@筑波大学情報です。こんにちは。
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> というプログラムが
何かでウケたんだけど、何でしたっけ?
\\ 新城 靖 (しんじょう やすし) \\
\\ 筑波大学 電子・情報 \\
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