Shell

Fish EDITOR 環境變數似乎不起作用

  • June 29, 2022

我最近開始使用 Fish shell。

echo $EDITOR返回vim

但是,當使用需要啟動編輯器並在EDITOR環境變數中查找它的程序時,它們似乎沒有找到任何東西。

作為使用pass edit(來自https://www.passwordstore.org/)的範例,它返回

vi: command not found``EDITOR(當env 變數中沒有設置任何內容時,它使用 vi 作為備份)

我錯過了什麼?

請注意,有一些程序會在$VISUAL環境變數之前查找$EDITOR環境變數,因此如果您都設置了,$VISUAL則會優先。

另請注意,shell 變數就是 shell 語言中的變數。您需要EDITOR=preferred-editor在他們的環境中呼叫命令以供他們使用。

Shell 可以將它們的一些變數映射到環境變數,然後var=value在它們執行的所有命令的環境中傳遞這些變數。在rc- 類 shell 中,對所有shell 變數都執行此操作,在 Bourne 類 shell 中,對export var. 在csh中,您用於setenv var value設置環境變數。在fish中,您使用以下-x選項set

> set var value
> echo $var
value
> printenv var
>

設置了一個$varshell 變數,但沒有導出(作為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取決於他們如何掃描他們收到的 env var 列表exceve()。您會發現一些命令/庫(如libc’s getenv())會選擇第一個,而有些會選擇最後一個。一些 shell 會將其中一個映射到它們相應的 env var,但可能會留下另一個並在進一步的執行中傳遞。

所以你可以做set -x VISUAL vim, 並printenv看到emacs因為fish兩者都執行了VISUAL=vi 並且VISUAL=emacs只修改了第一個VISUALprintenv給你第二個。

但是,要發生這種事情,您需要一些東西或某人積極地試圖欺騙您,並且在仔細檢查之後,它似乎fish是那些確實從環境中刪除重複項(如果有)的外殼之一。

引用自:https://unix.stackexchange.com/questions/707887