求助:Bash实现OCaml文件单行编译脚本报错问题解决
问题:Bash脚本实现OCaml单行编译失败
我想写一个Bash脚本实现OCaml文件的单行编译,但作为新手写的脚本执行报错,求帮忙。
我的脚本代码:
#!/bin/bash function argv { ocamlopt -o for (( i=0; i < $#; i++ )) do "${BASH_ARGV[i]}" done } argv "$@"
执行时出现的错误:
option '-o' needs an argument. Usage: ocamlopt <options> <files> Try 'ocamlopt --help' for more information. ./comp.sh: line 7: teste.sh: command not found ./comp.sh: line 7: teste: command not found
错误原因与解决方法
错误原因
ocamlopt -o单独执行:-o是ocamlopt的输出文件选项,必须紧跟输出文件名,你单独执行这行命令,没有传递必要的参数,所以触发参数缺失错误。- 错误处理脚本参数:循环里的
"${BASH_ARGV[i]}"是把每个参数当作独立命令运行,而不是传给ocamlopt作为参数,所以出现“找不到命令”的报错。
正确脚本写法
根据你的需求,有两种简单实现方式:
方式1:固定接收输出文件名和源文件
适合只需要快速指定输出和源文件的场景:
#!/bin/bash # 用法:./comp.sh <输出文件名> <OCaml源文件> ocamlopt -o "$1" "$2"
使用示例:./comp.sh teste teste.ml(将teste.ml编译为可执行文件teste)
方式2:支持所有ocamlopt参数
如果需要使用ocamlopt的其他编译选项,直接把所有参数传递给ocamlopt即可:
#!/bin/bash # 用法:./comp.sh <ocamlopt的所有参数> ocamlopt "$@"
使用示例:./comp.sh -o teste -O2 teste.ml(开启优化编译teste.ml为teste)
内容的提问来源于stack exchange,提问作者Thomaz
相关产品推荐
相关产品推荐

