如何在 fish shell 中设置环境变量?

9
我刚开始使用fish shell,尝试设置$EDITOR变量,以便在会话和重新启动期间保持不变。我已经尝试了以下方法:
1. 从命令行运行“set -gx EDITOR vim”。 2. 从命令行运行“set -Ux EDITOR vim”。 3. 运行上述命令,并在前面加上“set -e EDITOR”以取消先前的值。 4. 将上述命令添加到“~/.config/fish/config.fish”文件中(它会发出警告:“set: Warning: universal scope selected, but a global variable “EDITOR” exists.”)。 5. 卸载oh-my-fish并删除所有fish配置以从头开始。
无论我做什么,每当我打开一个新的终端、开始一个新的会话或重新启动时,EDITOR变量总是最终成为“/usr/bin/nano”。更奇怪的是,在“~/.config/fish/fishd.my-hostname”中,我看到“SET_EXPORT EDITOR vim”,而没有关于nano的任何信息。这是一种fish默认设置吗?如果是,如何正确设置?编辑:我在Antergos Linux上运行Fish 2.6.0。
1个回答

12

首先,fish的配置文件为~/.config/fish/config.fish。编辑您命名的文件不会产生任何影响。其次,fish没有任何默认设置,也不会设置EDITOR或VISUAL变量。因此,无论是什么将其设置为/usr/bin/nano的东西都是特定于您的系统的自定义。

如果您使用set -Ux EDITOR vim并且在config.fish中没有设置它,则即使在fish启动时已经设置过,它也应该被设置为vim。运行该设置命令然后执行set -U | grep EDITORenv | grep EDITOR来查看它是否被设置为通用变量并导出。现在输入fish以启动子shell。运行前两个命令,您应该看到它仍然设置为相同的值。现在在子shell中键入set -U EDITOR nano,然后键入exit。在早期的shell中,您现在应该看到EDITOR被设置为nano。

个人而言,我不喜欢使用uvars,因为目前它们是针对每台计算机的。我只需在我的~/.config/fish/config.fish中执行set -gX EDITOR (type -p vim)。这可以确保如果我在安装了我的~/.config/fish目录的新计算机上启动fish,则会获得我的预期默认值。

不使用uvar的另一个原因是解析顺序为本地范围、全局范围、通用范围。由于在fish开始运行时导入的环境变量位于全局范围中,它们将掩盖您定义的uvar。不要导出通用变量。这不太可能产生所需的结果。只需在您的config.fish脚本中set -gx该变量即可。

P.S. 提问此类问题时,您应始终包含相关事实,例如您正在使用的操作系统和fish版本。


没错,我已经编辑了我的问题以反映这一点。我可以运行您描述的命令,并且它们可以正常工作,但我猜问题在于跨会话使变量持久化。如果我运行 set -Ux EDITOR vim 然后打开一个新终端并运行 echo $EDITOR,它会显示 /usr/bin/nano。我正在尝试设置 $EDITOR 以便它在所有情况下都是持久的。 - Jonathan
那么你的fish配置中肯定有设置它为nano的内容。Fish本身不会这样做。将其设置为uvar可以解决问题,除非你在config.fish或相关脚本中随后执行了set -gx EDITOR nano。尝试使用以下方法代替:mkdir /tmp/fish,然后env HOME=/tmp/fish fish,接着将EDITOR设置为uvar,并使用相同的env命令启动另一个fish。你应该会发现EDITOR已经按预期设置了。 - Kurtis Rader
据我所知,我的fish配置中没有将EDITOR设置为nano的内容。我的整个~/.config/fish目录都在https://github.com/JonathanReeve/dotfiles/tree/master/dotfiles/.config/fish上,并且我已经使用grep搜索过了,没有提到nano。所以它是以其他方式设置的。您会发现我的fishd.jon-laptop文件在那里正确地设置了变量,因此在加载我的配置后,fish会加载另一个文件,并将其设置为nano。您说得对,我可以在/tmp中创建一个新的fish配置,并在那里设置变量,但它仍然将EDITOR设置为nano。 - Jonathan
1
好的,我知道发生了什么。根据文档:“可能有许多具有相同名称但不同作用域的变量。在使用变量时,将从内向外搜索变量作用域,即使用局部变量而不是具有相同名称的全局变量,使用全局变量而不是具有相同名称的通用变量。”当fish启动时导入的环境变量被设置为全局变量,因此优先于通用变量。我已经编辑了我的答案以明确这一点,并将在fish FAQ中添加一个条目以澄清这一点。 - Kurtis Rader
那么问题就是,fish在启动时运行的脚本是什么,将EDITOR设置为/bin/nano? - Jonathan
Fish并没有运行任何程序去设置它为nano。Fish已经被导出到环境中,由启动fish的任何程序或启动fish的程序等导致的。例如,如果你从bash启动fish,那么任何配置脚本(例如/etc/profile)都可能设置它。你可以通过在config.fish脚本中添加set -eg EDITOR来确保使用你的uvar并忽略当前的环境。 - Kurtis Rader

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接