亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

從 Go 程序內部調用源

從 Go 程序內部調用源

Go
慕沐林林 2021-10-11 13:35:38
為了好玩和更好地學習圍棋,我正在嘗試在圍棋中重新實現抗原。問題是:source是一個 shell 內置函數,所以我不能用os/exec Command函數調用它,因為它需要一個PATH.我怎樣才能做到這一點?并且,是否可以source從 go 程序內部進行影響用戶 shell?
查看完整描述

1 回答

?
弒天下

TA貢獻1818條經驗 獲得超8個贊

您可以直接在終端設備中編寫命令。但是,要做到這一點,首先您需要知道用戶正在使用哪個設備。執行程序的腳本可以是一種解決方案。


#!/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

請注意,我正在使用./not執行腳本source,因此腳本的 PID 不同。但是后來,go程序執行的命令有相同的PID。


查看完整回答
反對 回復 2021-10-11
  • 1 回答
  • 0 關注
  • 201 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號