Краткий ответ:
//usr/bin/clang "$0" && exec ./a.out "$@"
int main(){
return 0;
}
Хитрость в том, что ваш текстовый файл должен быть как действующим кодом C / C ++, так и сценарием оболочки. Не забудьте exit
из сценария оболочки до того, как интерпретатор достигнет кода C / C ++, или вызвать exec
magic.
Запуск с chmod +x main.c; ./main.c
.
Шебанг, подобный #!/usr/bin/tcc -run
, не нужен, потому что Unix-подобные системы уже будут выполнять текстовый файл в оболочке.
(адаптировано с этот комментарий )
Я использовал это в своем скрипте C ++:
//usr/bin/clang++ -O3 -std=c++11 "$0" && ./a.out; exit
#include <iostream>
int main() {
for (auto i: {1, 2, 3})
std::cout << i << std::endl;
return 0;
}
Если ваша строка компиляции слишком сильно растет, вы можете использовать препроцессор (адаптированный с этот ответ ), как показывает этот простой старый код C:
#if 0
clang "$0" && ./a.out
rm -f ./a.out
exit
#endif
int main() {
return 0;
}
Конечно, вы можете кэшировать исполняемый файл:
#if 0
EXEC=${0%.*}
test -x "$EXEC" || clang "$0" -o "$EXEC"
exec "$EXEC"
#endif
int main() {
return 0;
}
Теперь, для действительно эксцентричного разработчика Java:
/*/../bin/true
CLASS_NAME=$(basename "${0%.*}")
CLASS_PATH="$(dirname "$0")"
javac "$0" && java -cp "${CLASS_PATH}" ${CLASS_NAME}
rm -f "${CLASS_PATH}/${CLASS_NAME}.class"
exit
*/
class Main {
public static void main(String[] args) {
return;
}
}
D программисты просто помещают шебанг в начало текстового файла, не нарушая синтаксис:
#!/usr/bin/rdmd
void main(){}