使用sed in shell函数自动编译和运行F#代码

时间:2018-09-10 21:19:08

标签: shell sed

我正在尝试制作一个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"
}

我将如何解决此问题?

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。