为了好玩,为了更好地学习围棋,我正在努力在围棋中重新实现抗原。
问题是:source是一个shell内置函数,所以我不能用os/exec Command函数调用它,因为它需要PATH中的可执行文件。
我该怎么做?并且,是否有可能在go程序中使source影响用户shell?
发布于 2015-06-05 01:43:15
您可以直接在终端设备中写入命令。但是,要做到这一点,首先您需要知道哪个设备正在使用用户。执行程序的脚本可以是解决方案。
#!/bin/bash
echo Running from foo script, pid = $$
go run foo.go `tty`然后,程序必须将命令写入终端设备。
package main
import (
"C"
"fmt"
"os"
"syscall"
"unsafe"
)
func main() {
// Get tty path
if len(os.Args) < 2 {
fmt.Printf("no tty path\n")
os.Exit(1)
}
ttyPath := os.Args[1]
// Open tty
tty, err := os.Open(ttyPath)
if err != nil {
fmt.Printf("error opening tty: %s\n", err.Error())
os.Exit(2)
}
defer tty.Close()
// Write a command
cmd := "echo Hello from go, pid = $$\n"
cmdstr := C.CString(cmd)
cmdaddr := uintptr(unsafe.Pointer(cmdstr))
for i := range []byte(cmd) {
_, _, err := syscall.Syscall(syscall.SYS_IOCTL, tty.Fd(), syscall.TIOCSTI, cmdaddr+uintptr(i))
if uintptr(err) != 0 {
fmt.Printf("syscall error: %s\n", err.Error())
os.Exit(3)
}
}
}下面是一个输出示例:
$ echo $$
70318
$ ./foo
Running from foo script, pid = 83035
echo Hello from go, pid = $$
$ echo Hello from go, pid = $$
Hello from go, pid = 70318请注意,我使用的是./而不是source来执行脚本,因此脚本的PID不同。但是稍后,go程序执行的命令具有相同的PID。
https://stackoverflow.com/questions/30655143
复制相似问题