Help us understand the problem. What is going on with this article?

Shebang集

  • ファイルが+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

//usr/bin/env 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++も同様)
  • この方法であれば、出力先を指定できる処理系であれば何でも適用できそうですね
//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
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away