我正在尝试设置一个环境变量 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”字段。
所以你可以
- 获取进程的父进程pid
- 看看父母的环境
- 转至 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) 继承了它。