Вы можете написать команду непосредственно в терминальном устройстве. Но для этого сначала вам нужно знать, какое устройство использует пользователь. Сценарий, который выполняет вашу программу, может быть решением.
#!/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.
Даже если вы могли бы назвать «источник», вы не можете изменить родительскую среду процесса. Какой эффект вы пытаетесь достичь? – JimB
Печально:/Antigen - менеджер плагинов для ZSH ... так что, в основном, он git вытаскивает репозитории и отправляет файл * .plugin.zsh ... – caarlos0
Что грустно? Вот как работают раковины. Вся цель антигена - выполнить код оболочки в вашей оболочке. – JimB