Fish EDITOR环境变量似乎不起作用

Fish EDITOR环境变量似乎不起作用

我最近开始使用 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 之一。

相关内容