rav*_*ram 1 linux alias go subshell
我知道在 Linux 中我可以使用该alias命令来获取已定义别名的列表。我现在尝试通过 Go 代码执行相同的操作:
func ListAlias() error {
out, err := exec.Command("alias").Output()
if err != nil {
fmt.Println(err)
return err
}
fmt.Println(out)
return nil
}
Run Code Online (Sandbox Code Playgroud)
但返回的所有内容是:
exec: "alias": executable file not found in $PATH
Run Code Online (Sandbox Code Playgroud)
我尝试寻找实际的二进制文件在哪里alias,但这也无济于事:
$whereis alias
alias:
Run Code Online (Sandbox Code Playgroud)
我考虑的替代方案是解析~/.bashrc文件以获取定义的别名列表,但我遇到过这种情况,其中bashrc列出了另一个custom_aliases.sh文件并且所有别名都列在那里。这就是为什么我尝试使用该alias命令列出所有别名。
alias不是可执行文件,而是shell 内置命令。您可以通过运行轻松看到
$ type alias
alias is a shell builtin
Run Code Online (Sandbox Code Playgroud)
因此,您需要alias根据您使用的 shell 来调用 shell 的命令。例如,bash您需要使用
out, err := exec.Command("/bin/bash", "-c", "alias").Output()
Run Code Online (Sandbox Code Playgroud)
但这仍然无法给您答案,因为在这种情况下bash 不包含source该.bashrc文件,因此别名在子 shell 中不可用。您将需要--rcfileor --login/-l选项,还需要将shell 指定为与-i
out, err := exec.Command("/bin/bash", "-lic", "alias").Output()
// or
out, err := exec.Command("/bin/bash", "--rcfile", "~/.bashrc", "-ic", "alias").Output()
Run Code Online (Sandbox Code Playgroud)
exec.Command("/bin/bash", "-ic", "alias")也可能取决于您的别名的来源。-ic其他 shell,如 zsh、sh、dash... 可能会使用不同的选项获取不同的文件,因此如果或-lic不起作用,请检查您的 shell 文档