登录
首页 >  Golang >  Go问答

os.Getenv 和 os.LookupEnv 不返回 $HISTFILE、$HISTSIZE 和 $SAVEHIST 的值

来源:stackoverflow

时间:2024-04-19 22:51:32 141浏览 收藏

今日不肯埋头,明日何以抬头!每日一句努力自己的话哈哈~哈喽,今天我将给大家带来一篇《os.Getenv 和 os.LookupEnv 不返回 $HISTFILE、$HISTSIZE 和 $SAVEHIST 的值》,主要内容是讲解等等,感兴趣的朋友可以收藏或者有更好的建议在评论提出,我都会认真看的!大家一起进步,一起学习!

问题内容

我正在使用 zsh,并且我正在尝试访问这些环境变量:

$ echo $histfile
/home/amir/.zsh_history
$ echo $histsize
50000
$ echo $savehist
10000

但是 os.lookupenv 返回 "",对于所有三个都返回 false,并且 os.getenv 自然返回一个空字符串:

package main

import (
    "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/.zshrc
export histfile="$home/.zsh_history"
export histsize=1000000
export savehist=1000000

然后它就可以工作并返回正确的值:

$ go run hyst.go
/home/amir/.zsh_history
1000000
1000000

当我没有显式导出这些变量时,$histsize$savehist 的值不同,但它们不为空。那么为什么这些函数会为这些变量返回空字符串呢?


正确答案


这是因为 $histfile$histsize$savehist 默认情况下不是环境变量,而只是由 oh-my-zsh 设置的shell 变量

## history file configuration
[ -z "$histfile" ] && histfile="$home/.zsh_history"
[ "$histsize" -lt 50000 ] && histsize=50000
[ "$savehist" -lt 10000 ] && savehist=10000

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

区分 environment and shell variables 很重要:

  • 环境变量可以在子进程中访问,但 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
    

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

$ env | grep -i "shell"; echo $?
shell=/usr/bin/zsh
0

所以$shell实际上是一个环境变量。现在查看历史变量:

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

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

以上就是《os.Getenv 和 os.LookupEnv 不返回 $HISTFILE、$HISTSIZE 和 $SAVEHIST 的值》的详细内容,更多关于的资料请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>