bas*_*ian 1 shell environment-variables fish
我最近开始使用 Fish shell。
echo $EDITOR
回报vim
但是,当使用需要启动编辑器并在EDITOR
环境变量中查找它的程序时,他们似乎找不到任何东西。
pass edit
作为使用(来自https://www.passwordstore.org/ )时的示例,它返回
vi: command not found
(当 env 变量中未设置任何内容时,它使用 vi 作为后备EDITOR
)
我错过了什么?
请注意,一些程序会$VISUAL
在环境变量之前查找环境变量$EDITOR
,因此如果两者都设置了,$VISUAL
则会优先。
另请注意,shell 变量就是 shell 语言中的变量。您需要EDITOR=preferred-editor
在他们的环境中调用命令,以便他们接受它。
shell 可以将它们的一些变量映射到环境变量,然后将这些变量作为var=value
它们执行的所有命令的环境中传递。在rc
类 shell 中,这是对所有shell 变量完成的,在类 Bourne shell 中,这是用export var
. 在 中csh
,您可以用来setenv var value
设置环境变量。在 中fish
,您使用-x
以下选项set
:
> set var value
> echo $var
value
> printenv var
>
Run Code Online (Sandbox Code Playgroud)
设置了 shell变量$var
,但未导出(作为var=value
)到传递给 的环境printenv
。
> set -x var value2
> echo $var
value2
> printenv var
value2
Run Code Online (Sandbox Code Playgroud)
这一次,确实在它收到的环境中printenv
得到了一个。var=value2
printenv
不是标准命令,但很常见。env
是一个标准命令,所以如果您的系统没有printenv
,您可以尝试:
env | grep -E '^(VISUAL|EDITOR)='
Run Code Online (Sandbox Code Playgroud)
不过,如果您的变量具有诸如var=<newline>VISUAL=
或大于 的值,则它可能会被愚弄LINE_MAX
。
其他选项可能是:
perl -le 'print $ENV{VISUAL}'
Run Code Online (Sandbox Code Playgroud)
python -c 'import os; print(os.getenv("VISUAL"))'
Run Code Online (Sandbox Code Playgroud)
var=value
另请注意,虽然这里的情况极不可能发生,但对于给定var
的环境,执行具有多个命令的命令是可能的。
例如,你可以这样做
execve("/path/to/cmd", ["cmd", "some arg"], ["VISUAL=vi", "VISUAL=emacs"])
Run Code Online (Sandbox Code Playgroud)
cmd
将环境变量视为具有什么值VISUAL
将取决于他们如何扫描收到的环境变量列表exceve()
。您会发现某些命令/库(例如libc
's getenv()
)会选择第一个,而有些则会选择最后一个。某些 shell 会将其中一个映射到相应的环境变量,但可能会保留另一个并在进一步的执行中传递。
所以你可以做set -x VISUAL vim
, 并printenv
看到emacs
因为fish
是用两者执行的VISUAL=vi
并且VISUAL=emacs
只修改了第一个VISUAL
,同时printenv
给你第二个。
不过,要发生这种事情,您需要某些东西或某人积极地试图欺骗您,并且经过仔细检查,它似乎fish
是那些确实从环境中删除重复项(如果有)的 shell 之一。