何とは言わない天然水飲みたさ

ソースコード直接実行のテクニック

[0] 。 普通の人は素直に Make 等を使ったり、それ用のラッパー等を使ったり、エディタで提供されている機能やプラグインやシェル履歴でどうにかするものなのであろうが。 ものぐさな私は、ソースコードをターミナルから直接コンパイルし実行する方法を考えていた。

そして、以下の言語について良い方法を思い付いた。

本当は TeX 等にもこの方法を適用したかったのだが、残念ながらうまい手が思い付かなかった。 TeX 等の他のフォーマットについて良い方法をご存知であれば是非 Twitter とかで教えていただきたい。

利点

[1] であり、標準入力を無視し、何も出力せず終了する。 この「標準入力の無視」が重要で、ここにソースコードの中でシェルが無視すべき部分(ブロックコメント開始)が流れ込めば良いわけである。

この流し込みを、ヒアドキュメントで行う。 コマンドラインにて <<FOOBAR のようにすると、最初の FOOBAR という行までの内容が改行含めそのままテキストとして標準入力へ流されるというのが、ヒアドキュメントの機能である。 ヒアドキュメント終了の記号もまた、ソースコードの言語では無視されてほしいため、行コメントの記号(ここでは //)をそのまま使う。 ヒアドキュメントを無視させることでブロックコメント代わりに使う手法は、シェルスクリプトに限らず割と一般的である [2]

/bin/true を、スラッシュ2つでなく3つにして ///bin/true のように指定するのにも、理由がある。

E10) Why does cd // leave $PWD as //?

POSIX.2, in its description of cd, says that three or more leading slashes may be replaced with a single slash when canonicalizing the current working directory.

This is, I presume, for historical compatibility. Certain versions of Unix, and early network file systems, used paths of the form //hostname/path to access 'path' on server 'hostname'.

Bash FAQ, version 4.14, for Bash version 4.4, 2017-04-02

linux - what is path //, how is it different from / - Stack Overflow で紹介されているこの説明がすべてである。 three or more leading slashes may be replaced with a single slash とのことなので、まあ2つ並べるよりは3つ以上並べた方が安心だろうという、それだけのことだ。

とはいえ、これは昔の bash (今どうなのかは知らない)のカレントディレクトリの扱いについての記述であり、シェルスクリプト一般についてそのまま適用できるかは知らない。 そもそも互換性のためだろうとも書いてあるため、現代においてスラッシュは幾つあろうが関係ないのかもしれない。

2行目、3行目: ブロックコメント開始とヒアドキュメント終了

/etc/grub.d/40_custom 等がこのテクニックを使っている。

ヒアドキュメントでも大きなデータを埋め込むことはできるが、その場合埋め込むデータにヒアドキュメントの終端記号だけを持つ行が含まれないことを保証する必要がある。 一方でシェルスクリプトを途中で終了する場合は、データに制限はない。

exit 以降