インラインコードに対して「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

私のプログラムをインラインで実行するように欺く方法はありますか?現在、次のエラーが発生します。

パッケージ /dev/fd/63: import '/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

上記の内容は利用できません。これは、末尾のみサポートされているフルネームのファイルをBSDにmktemp /tmp/XXXXXXX.go自動的に生成します。また、そのファイルが存在し、書き込み可能であり、一時ファイルを生成するためのデフォルトの場所であるとは想定できません。/tmp/XXXXXXX.gomktempXs/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

おすすめ記事