LoginSignup
8
5

More than 1 year has passed since last update.

Shebang集

Last updated at Posted at 2018-06-20
  • ファイルが+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

//usr/bin/env scala $0 $@;exit

C#

  • csとcsxを用意します。
  • csxで以下のようにします。
//usr/bin/env csi $0 $@;exit

#load "prog.cs"
Klass.Main()

example: https://github.com/cielavenir/procon/blob/a3d296fb26cd10b1cadf1e5831c1958b4f310c42/hena/tyama_hena24_enum.csx

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
8
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
5