猿问

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

我正在使用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是不同的,但它们不为空。那么为什么这些函数会为这些变量返回空字符串呢?


小唯快跑啊
浏览 177回答 1
1回答

慕标5832272

这是因为$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/zsh0事实上$SHELL,环境变量也是如此。现在对于历史变量:$ env | grep -iE "histfile|histsize|savehist"; echo $?1退出代码为 1,表示无法在环境变量列表中找到这些名称。
随时随地看视频慕课网APP

相关分类

Go
我要回答