我正在尝试制作一个bash脚本,以从终端快速编译并运行F#代码。通常,如果您有一个名为myCode.fsx
的文件,执行此操作的方法是运行以下命令:
fsharpc myCode.fsx && mono myCode.exe
我试图在shell中编写一个小函数来提供帮助,该函数将代码的文件名(包括.fsx
)作为第一个也是唯一的参数。但是我认为Sed
命令遇到了一些麻烦。这是我的代码,起初可以很好地编译.fsx
文件,但是后来我认为Sed
进入并更改了刚刚创建的myCode.exe
文件中的文本,而不仅仅是更改了要运行的终端命令中的文件扩展名:
function fsx {
fsharpc "$1" && mono | sed 's/fsx/exe/' "$1"
}
我将如何解决此问题?
答案 0 :(得分:1)
要按照开始的方式进行操作,需要command substitution和类似here-string的东西,而不是管道:
fsx() {
fsharpc "$1" && mono "$(sed 's/fsx$/exe/' <<< "$1")"
}
我将fsx
固定在字符串的末尾,只是为了避免文件名在其他位置包含fsx
时出现问题。
但是,只需使用parameter expansion,您就可以不用外部工具就能做到:
fsx() {
fsharpc "$1" && mono "${1%fsx}exe"
}
${1%fsx}
从fsx
的末尾删除$1
,结束时仅附加了exe
。
请注意,我使用的是fsx()
而不是function fsx
;前者是所有POSIX shell都可以理解的,后者是Bashism。