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

使用sed-in-shell函数自动编译和运行F#代码,shell,sed,Shell,Sed,我正在尝试制作一个bash脚本,以便从终端快速编译和运行F#代码。通常,如果您有一个名为myCode.fsx的文件,那么执行此操作的方法是运行以下命令: fsharpc myCode.fsx && mono myCode.exe 我试图在shell中编写一个小函数来提供帮助,它将代码的文件名(包括.fsx)作为其第一个也是唯一的参数。但是我想我在使用Sed命令时遇到了一些问题。这是我的代码,它一开始很好地编译了.fsx-文件,但我认为Sed会进入并更改刚刚创建的myCode.e

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

如何解决此问题?

若要按开始时的方式解决此问题,您需要使用类似于管道的工具:

fsx() {
    fsharpc "$1" && mono "$(sed 's/fsx$/exe/' <<< "$1")"
}
${1%fsx}
$1
的末尾删除
fsx
,只需附加
exe

请注意,我使用了
fsx()
而不是
函数fsx
;前者为所有POSIX Shell所理解,后者为巴什主义

如果您确实使用Bash,那么还有另一个参数扩展可以更接近地表示“字符串末尾的替换模式”:

"${1/%fsx/exe}"

要按照开始的方式进行,您需要一个类似于管道而不是管道的东西:

fsx() {
    fsharpc "$1" && mono "$(sed 's/fsx$/exe/' <<< "$1")"
}
${1%fsx}
$1
的末尾删除
fsx
,只需附加
exe

请注意,我使用了
fsx()
而不是
函数fsx
;前者为所有POSIX Shell所理解,后者为巴什主义

如果您确实使用Bash,那么还有另一个参数扩展可以更接近地表示“字符串末尾的替换模式”:

"${1/%fsx/exe}"

非常感谢,第二种方法很有魅力。简单有效的回答。非常感谢,第二种方法很有魅力。简单有效的答案。