如何执行bash shell函数

3
我们有许多用于各种用途的 shell 函数,它们被添加到我们的 .bash_profiles 中并且我们每天都会使用。我们像普通二进制文件一样调用这些函数。
我试图从 Go 应用程序内部调用这些相同的 shell 函数,但是它无法找到它们,因为显然在不同的上下文中运行,并且无法在 $PATH 中找到它们。
错误信息为:exec: “finderx”:在 $PATH 中找不到可执行文件 有人知道如何在与终端相同的上下文中从 Go 应用程序执行 shell 命令吗?或者以某种方式重新加载它们?如果可能的话,我不想重新实现这些函数。我想像在脚本中一样轻松地调用它们来简化过渡期。我们将逐步将所有内容移植到 Go 上,但目前,我们必须使用 shell 函数。

1
如果它是一个 shell 函数,那么它不是可执行文件。你只能在该 shell 中调用 shell 函数。 - JimB
明白了。但是如果应用程序正在从该 shell 中运行,难道就没有办法看到这些函数吗?这只是一个 CLI 工具,最终要替换掉 shells 的函数。 - Cheyne
3
bash -c 是一个 Bash 命令,它允许在单个命令行中运行命令字符串,而不需要创建一个脚本文件。 - zerkms
仍然不好,给出了“退出状态127”。 - Cheyne
1
@Cheyne,我刚刚通过调用一个作为函数定义的 shell 别名来检查我的解决方案了 - 一切工作正常 :) - Alexander Zinchenko
2个回答

5
我想你可以简单地调用bash -l -c 'your alias function'。只需确保你的.bash_aliases或另一个包含你函数的点文件被从.bashrc中引用(顺便说一下,非交互式登录shell不会读取.bashrc,因此应该从.bash_profile中引用.bashrc)。

2
创建一个包装脚本,可以运行命令行参数。 例如: /home/user/run.sh
#!/bin/sh
source ~/.bash_profile
$1

test.go

package main

import (
    "fmt"
    "os/exec"
)  

func main(){
    testCmd := exec.Command("/home/user/run.sh","func123")        
    testOut, err := testCmd.Output()
    if err != nil {
        panic(err)
    } 
    fmt.Println(string(testOut))
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接