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