- ファイルが+xされた時直接実行できること
- コンパイルできる言語はコンパイルも普通に行えること
- を条件とします
なお、Perl等の自明なものは掲載しません。
D
#!/usr/bin/env rdmd
R
#!/usr/bin/env Rscript
- Rscriptが使えない古いバージョンではlittlerが使えます
#!/usr/bin/env r
Haskell
#!/usr/bin/env runghc
Crystal
- コンパイルキャッシュ機能が内蔵されています
#!/usr/bin/env crystal
Boo
#!/usr/bin/env booi
Groovy
- 普通の書き方でgroovycも問題なく使えます
#!/usr/bin/env groovy
Kotlin
- コンパイル用の.ktを直接実行するには、現状ではkscriptが必要です
- 現状では.ktは.ktsと同様に
#!
形式が許容されていますが、今後変更されるかもしれないのがちょっと…
#!/usr/bin/env kscript
//usr/bin/env kscript $0 $@;exit
Awk
- envを経由できない環境があるかもしれません
#!/usr/bin/env awk -f
- こちらであれば使える環境があるかもしれません
#!/usr/bin/awk -f
Sed
- envを経由できない環境があるかもしれません(以下同様)
#!/usr/bin/env sed -f
Octave
- envを経由できない環境があるかもしれません(以下同様)
#!/usr/bin/env octave -q
以下では厳密にはShebangではありませんがシェルスクリプトのPolyglotとして扱うことで+xを実現できるものを挙げます。
Go
(runと$0の間に-gcflags=-G=3を付けても良いと思います1.17以降専用になりますが。 1.18で不要になりましたね)
//usr/bin/env GO111MODULE=off go run $0 $@;exit
Swift
//usr/bin/env swift $0 $@;exit
F#
- 拡張子は.fsxに限定されます(fsxでもコンパイルは可能です)
- 直接実行の場合、C言語ライブラリ等(要するにSystem.Runtime.InteropServices)は呼べなくなります
//usr/bin/env fsharpi $0 $@;exit
Java
- Java 11以降限定です
-
#!
形式も使えるようですが、javacではエラーになるため採用しませんでした。
//usr/bin/env java $0 $@;exit
Scala
-
extends App
は使えなくなるので注意してください - https://qiita.com/cielavenir/items/b83552a761419be57285
//usr/bin/env scala $0 $@;exit
C#
- csとcsxを用意します。
- csxで以下のようにします。
//usr/bin/env csi $0 $@;exit
#load "prog.cs"
Klass.Main()
C
tempfile(汎用)
- キャッシュを作成しないため、コンパイルに時間がかかるプログラムは要注意 (C++も同様)
- この方法であれば、出力先を指定できる処理系であれば何でも適用できそうですね
[221007] ちゃんと明文化してなかったけど、これ、コンパイルフラグをコードの形で残せる点ではかなり有用だと思います。C/C++の規格指定やリンクすべきライブラリなど。
//usr/bin/env true; tmpfile=$(mktemp); gcc -O2 -std=gnu99 -xc -o $tmpfile $0 && $tmpfile "$@"; rm $tmpfile; exit
picoc
- picocはいろいろ制限が多いです。
//usr/bin/env picoc $0 - $@;exit
C++
tempfile(汎用)
//usr/bin/env true; tmpfile=$(mktemp); g++ -O2 -std=gnu++11 -xc++ -o $tmpfile $0 && $tmpfile "$@"; rm $tmpfile; exit
C (external cacher)
- 紹介のみ
- https://github.com/ryanmjacobs/c
-
#!
形式を使った場合、cコマンドで取り除かれた結果コンパイルできるだけなので、通常のコンパイルができなくなることは言うまでもないです
//usr/bin/env c $0 $@;exit