简答:
//usr/bin/clang "$0" && exec ./a.out "$@"
int main(){
return 0;
}
诀窍在于您的文本文件必须是有效的 C/C++ 代码和 shell 脚本。记得在解释器到达 C/C++ 代码之前从 shell 脚本中 exit,或者调用 exec 魔法。
使用chmod +x main.c; ./main.c 运行。
不需要像 #!/usr/bin/tcc -run 这样的 shebang,因为类 unix 系统已经在 shell 中执行文本文件。
(改编自this comment)
我在我的 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;
}
如果您的编译行增长过多,您可以使用预处理器(改编自 this answer),正如这段普通的旧 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 程序员只需在文本文件的开头放置一个 shebang,而不会破坏语法:
#!/usr/bin/rdmd
void main(){}
见: