为了账号安全,请及时绑定邮箱和手机立即绑定

os.Getenv 和 os.LookupEnv 不返回 $HISTFILE

os.Getenv 和 os.LookupEnv 不返回 $HISTFILE

Go
小唯快跑啊 2022-12-05 17:16:10
我正在使用zsh,并且正在尝试访问这些环境变量:$ echo $HISTFILE/home/amir/.zsh_history$ echo $HISTSIZE50000$ echo $SAVEHIST10000但是os.LookupEnv返回"", false所有三个,并且os.Getenv自然地返回一个空字符串:package mainimport (    "fmt"    "os")func main() {    histfile, found := os.LookupEnv("HISTFILE")    if found {        fmt.Println(histfile)    } else {        fmt.Println("$HISTFILE not found")    }    histsize, found := os.LookupEnv("HISTSIZE")    if found {        fmt.Println(histsize)    } else {        fmt.Println("$HISTSIZE not found")    }    savehist, found := os.LookupEnv("SAVEHIST")    if found {        fmt.Println(savehist)    } else {        fmt.Println("$SAVEHIST not found")    }}$ go run main.go$HISTFILE not found$HISTSIZE not found$SAVEHIST not found现在,如果我export将这些变量放入$HOME/.zshrc:$ grep -iE "histfile|histsize|savehist" $HOME/.zshrcexport HISTFILE="$HOME/.zsh_history"export HISTSIZE=1000000export SAVEHIST=1000000然后它工作并返回正确的值:$ go run hyst.go/home/amir/.zsh_history10000001000000当我没有显式导出这些变量时,$HISTSIZE和的值$SAVEHIST是不同的,但它们不为空。那么为什么这些函数会为这些变量返回空字符串呢?
查看完整描述

1 回答

?
慕标5832272

TA贡献1966条经验 获得超4个赞

这是因为$HISTFILE、$HISTSIZE和$SAVEHIST不是默认情况下的环境变量,而只是通过以下方式设置的shell 变量oh-my-zsh:


## History file configuration

[ -z "$HISTFILE" ] && HISTFILE="$HOME/.zsh_history"

[ "$HISTSIZE" -lt 50000 ] && HISTSIZE=50000

[ "$SAVEHIST" -lt 10000 ] && SAVEHIST=10000

这些是您在使用inecho之前使用时看到的值。export$HOME/.zshrc


区分环境变量和 shell 变量很重要:


子进程可以访问环境变量,但 shell 变量不能。您可以通过简单地创建一个子进程来验证此语句:


$ # Child processes don't inherit shell variables

$ key=value; sh -c 'echo "key=$key"'

key=


$ # They do, however, inherit environment variables

$ export key=value; sh -c 'echo "key=$key"'

key=value

为了能够访问子进程中的 shell 变量,您可以export这样做,就像您在以下代码中所做的那样$HOME/.zshrc:


$ key=value; export key; sh -c 'echo "key=$key"'

key=value

现在,要查看特定变量是否为环境变量echo,您可以直接检查environment 变量列表,而不是使用 。


$ env | grep -i "shell"; echo $?

SHELL=/usr/bin/zsh

0

事实上$SHELL,环境变量也是如此。现在对于历史变量:


$ env | grep -iE "histfile|histsize|savehist"; echo $?

1

退出代码为 1,表示无法在环境变量列表中找到这些名称。


查看完整回答
反对 回复 2022-12-05
  • 1 回答
  • 0 关注
  • 176 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信