我知道在 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
}
但是返回的都是:
exec: "alias": executable file not found in $PATH
我尝试寻找
alias
的实际二进制文件在哪里,但这也无济于事:
$whereis alias
alias:
我考虑的替代方案是解析
~/.bashrc
文件以获取定义的别名列表,但我遇到过这种情况,其中 bashrc
列出了另一个 custom_aliases.sh
文件,并且所有别名都列在那里。这就是为什么我尝试使用 alias
命令列出所有别名。
alias
不是可执行文件,而是一个 shell 内置。你可以通过运行轻松看到这一点
$ type alias
alias is a shell builtin
因此,您需要根据您使用的 shell 调用 shell 的
alias
命令。例如,对于 bash
,您需要使用
out, err := exec.Command("/bin/bash", "-c", "alias").Output()
但这仍然不会给你答案,因为在这种情况下,bash 不会
source
.bashrc
文件,因此别名在子 shell 中不可用。您需要 --rcfile
或 --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()
exec.Command("/bin/bash", "-ic", "alias")
也可能起作用,具体取决于您的别名的来源。其他 shell,如 zsh、sh、dash... 可能会使用不同的选项获取不同的文件,因此如果 -ic
或 -lic
不起作用,请检查您的 shell 文档
怎么样 $compgen -a -a 告诉命令 compgen 列出所有别名
或
$别名