变量继承自 Fishshell

变量继承自 Fishshell

我正在尝试设置一个环境变量 EDITOR 并将其更改为默认值,但由于这种行为 /usr/bin/nano我无法使用set -Ux鱼常见问题解答

如何找出fish继承的是哪个设置? (这样我就可以改变它)

编辑: /etc/environment为空

set -S EDITOR
$EDITOR: set in global scope, exported, with 1 elements
$EDITOR[1]: |/usr/bin/nano|
$EDITOR: set in universal scope, exported, with 1 elements
$EDITOR[1]: |/usr/bin/nvim|
$EDITOR: originally inherited as |/usr/bin/nano|

答案1

在fish中,从3.6.0版本开始,你可以询问set --show variable,它会告诉你fish最初继承了什么值。例如:

> set --show foo
$foo: set in global scope, exported, with 1 elements
$foo[1]: |banana|
$foo: originally inherited as |bar|

这将帮助您确定该值是否是 Fish 在启动时从其父进程获取的值,或者是否在 Fish 内部进行了更改。

如果您的问题只是打开编辑器打开nano的东西,那么完全有可能没有任何东西实际设置编辑器,并且这些东西默认查看“nano”,“vim”,“emacs”,“joe”等列表打开第一场比赛。在这种情况下set --show EDITOR,不会向您显示任何内容。

或者你继承了它,并且它只是在 /etc/bashrc 或 /etc/profile 中设置 - 发行版通常在这些中设置默认设置。只需grep -r EDITOR /etc显示其中任何一个即可。


如果您确实有一个继承的 $EDITOR,并且在 /etc/ 中找不到它,您可以做一些事情,但它们严重依赖于操作系统并且不可移植。 Fish 不是父进程,您需要查看父进程列表。

例如,Linux 有 /proc/ 文件系统,您可以在 /proc/$pid/environ 中找到进程的环境,其中包含 NUL 分隔的“var=val”字段。

所以你可以

  1. 获取进程的父进程pid
  2. 看看父母的环境
  3. 转至 1

直到父进程 pid 为 0,这意味着没有父进程(这将是 pid 为 1 的 init)。

作为一个快速草图:

# Start with fish's pid
set -l ppid $fish_pid
# Get the parent pid - ps' output format is fairly terrible and unportable
while set -l ppid (ps -o ppid -p $ppid | string trim)[2]
      and test "$ppid" -gt 0
    # print the pid and the matching environ value
    echo $ppid (sudo grep -z foo /proc/$ppid/environ | string split0)
end

您可能会得到如下输出:

1305 foo=bar
759
9
8
7
1

这意味着 pid“1305”的进程具有“foo”的值“bar”,而其父进程在其环境中没有该值。请注意,在此示例中,我在进程 759 中设置了变量 (with export foo=bar) - 但它的环境中没有该变量,因为这是它继承的值。

所以在大多数情况下设置它的过程将是一个最后一个具有继承值的。

您可以ps通过以下方式询问有关该过程的信息ps -p 759(根据需要插入您的 PID):

  PID TTY          TIME CMD
  759 pts/0    00:00:00 bash

因此在这种情况下,一个 bash 进程设置了该变量,另一个 bash 进程 (1305) 继承了它。

相关内容