このミニ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.go
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