이 미니 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