После некоторых испытаний я нашел этот шебанг:
#!/bin/sh
"true" = let x' = "" in (*'
sh script here
*) x'
Это своего рода улучшение предложения Жиля, поскольку оно позволяет написать полный сценарий оболочки внутри комментария OCaml, не беспокоясь овсе с несовместимостью синтаксиса.
Сценарий должен завершиться (например, с exec
или exit
) без достижения конца комментария, в противном случае произойдет синтаксическая ошибка.Это можно легко исправить, но это не очень полезно для предполагаемого использования такого трюка.
Вот вариант, который влечет за собой нулевые издержки времени выполнения на стороне OCaml, но объявляет новое имя типа (выберите егопроизвольно усложняется, если это беспокоит):
#!/bin/sh
type int' (*' >&- 2>&-
sh script here
*)
Например, вот скрипт, который выполняет код OCaml с модулями Str и Unix, а также может компилировать его при передаче параметра --compile
:
#!/bin/sh
type int' (*' >&- 2>&-
if [ "$1" = "--compile" ]; then
name="${0%.ml}"
ocamlopt -pp 'sed "1s/^#\!.*//"' \
str.cmxa unix.cmxa "$name.ml" -o "$name" \
|| exit
rm "$name".{cm*,o}
exit
else
exec ocaml str.cma unix.cma "$0" "$@"
fi
*)