如何针对内联代码运行“go run”

如何针对内联代码运行“go run”

我有这个迷你 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

相关内容