当前位置: 首页 > 面试题库 >

从Go程序内部调用源

姬正文
2023-03-14
问题内容

为了娱乐并更好地学习Go,我正在尝试在Go中重新实现抗原。

问题是:source是shell内置函数,所以我不能用os/exec Commandfunction
调用它,因为它希望在中有可执行文件PATH

我怎样才能做到这一点?并且,是否有可能使sourcego程序内部的程序影响用户shell?


问题答案:

您可以直接在终端设备中编写命令。但是,要做到这一点,首先您需要知道哪个设备正在使用该用户。执行程序的脚本可能是解决方案。

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



 类似资料:
  • 问题内容: 如何从处理程序内部正确引用路由名称? 应该全局分配而不是放在函数内部? 问题答案: 您具有返回给定请求的路由的方法。根据该请求,您可以创建一个子路由器并调用 示例:(播放:http : //play.golang.org/p/Lz10YUyP6e)

  • 问题内容: 我的API有ExpressJS路由,我想从NodeJS内调用它 在我的 ./routes/api.js 文件中 因此,如果我想从前端调用其所有查找内容,但是我需要从NodeJS脚本的另一个方面进行调用,而不必在第二个位置再次重新定义整个函数 我曾尝试从内部使用HTTP模块,但出现“ ECONNREFUSED”错误 我了解Express背后的想法是创建路线,但是如何在内部调用它们 问题答

  • 问题内容: 如何在Java中调用node.js并将console.log值保存在String变量中? 问题答案: Java应用程序可能与正在运行的Node.JS应用程序进行通信。例如,您可以在可用端口上运行Node.JS应用,而Java应用可以通过tcp套接字与之通信。 http://nodejs.org/api/net.html 或者,您可以创建一个http服务器并公开Java应用程序可以使用的

  • 问题内容: 我有一个程序和一个脚本,希望将其合并到我的Web应用程序中。 我想使用它们来解析上传到我的网站的文件;处理过程可能需要几秒钟,因此我也避免阻止该应用程序。 我如何才能只接受文件,然后仅在控制器的子过程中运行程序和脚本? 问题答案: 参见child_process。这是一个使用的示例,它允许您在输出数据时写入stdin并从stderr / stdout中读取。如果您不需要写stdin并且

  • 问题内容: 使用这样的函数: 我在输出中看到了print_trace的详细信息。 还有什么其他方法可以做到? 问题答案: 您在我的另一个答案(现已删除)中提到,您还希望查看行号。从应用程序内部调用gdb时,我不确定该怎么做。 但是,我将与您分享几种 不使用gdb 即可打印具有函数名称及其相应行号的简单stacktrace的方法。其中大多数来自Linux Journal的 一篇 非常好的 文章: 方

  • 这个包的主要用途就是在 API 内部执行请求。它允许你在可用的 API 基础上构建你的应用。内部请求也可以返回原始数据,而不是原始响应对象,这意味着你可以获得与之相关的所有语法糖。 我们需要构建一个分发器实例来发起内部请求。 $dispatcher = app('Dingo\Api\Dispatcher'); 我们现在可以用标准的 HTTP 进行内部请求. Route::get('/', func