我有这个迷你 bash 脚本
#!/usr/bin/env bash
go run <(cat <<EOF
package main
import "log"
func main(){
log.Println("here 123")
}
EOF
)
go run
接受文件路径参数,通常类似于:
go run main.go
有没有办法欺骗 go 来运行我的内联程序?我目前收到此错误:
包/dev/fd/63:导入“/dev/fd/63”:无法导入绝对路径
答案1
像所有高雅的工具和语言一样,go
它不容易以作者不喜欢或预见的方式使用。
在这种情况下,go
不希望与不以 结尾的路径有任何关系*.go
。
解决方案可能是使用名为的临时文件*.go
:
gorun(){
t=$(mktemp -d) && cat > "$t/in.go" && go run "$t/in.go"
e=$?; rm -fr "$t"; return "$e"
}
gorun <<'EOT'
...
EOT
我不能使用mktemp /tmp/XXXXXXX.go
上面的;这将默默地创建一个/tmp/XXXXXXX.go
在 BSD 上完全命名的文件,其中mktemp
仅支持尾随Xs
.另外,我不能假设它/tmp
存在、可写并且是默认创建临时文件的位置。
这一点已经没有实际意义了,而且go
管道和其他非常规文件也存在问题,因此进程替换无论如何都不起作用:
% ln -s /dev/fd/3 fd3.go
% go run fd3.go 3<<<'package main; func main(){}'
// OK
% go run fd3.go 3< <(echo 'package main; func main(){}')
# command-line-arguments
./fd3.go:1:1: syntax error: package statement must be first
% cat fd3.go 3< <(echo 'package main; func main(){}')
package main; func main(){}
// WTF?
% mkfifo fifo.go
% go run fifo.go &
[1] 8849
% echo 'package main; import "log"; func main(){log.Println("yuck!")}' > fifo.go
// if at first you don't succeed ...
% echo 'package main; import "log"; func main(){log.Println("yuck!")}' > fifo.go
% 2020/02/06 11:21:53 yuck!
[1]+ Done go run fifo.go