인라인 코드에 대해 "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

관련 정보