本文提供了在环境变量$PATH设置的目录里查找符合条件的文件的方法。
实现函数
go
import (
"fmt"
"os"
"path"
"strings"
)
// 实现 unix whtich 命令功能
func Which(cmd string) (filepath string, err error) {
// 获得当前PATH环境变量
envPath := os.Getenv("PATH")
// 分割为多个路径
path_list := strings.Split(envPath, ":")
for _, dirpath := range path_list {
// 判断环境变量路径是否是目录
dirInfo, err := os.Stat(dirpath)
if err != nil {
return "", err
}
if !dirInfo.IsDir() {
continue
}
// 判断命令所在的路径是否存在
filepath := path.Join(dirpath, cmd)
_, err = os.Stat(filepath)
if err == nil || os.IsExist(err) {
return filepath, nil
}
}
return "", err
}
单元测试
go
import (
"testing"
"github.com/stretchr/testify/assert"
)
func TestWhich(t *testing.T) {
filepath, _ := Which("sh")
assert.Equal(t, filepath, "/bin/sh")
filepath, err := Which("xxx")
assert.Equal(t, filepath, "")
assert.ErrorContains(t, err, "no such file or directory")
}