Fish EDITOR 環境變數似乎不起作用
我最近開始使用 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 >
設置了一個
$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
取決於他們如何掃描他們收到的 env var 列表exceve()
。您會發現一些命令/庫(如libc
’sgetenv()
)會選擇第一個,而有些會選擇最後一個。一些 shell 會將其中一個映射到它們相應的 env var,但可能會留下另一個並在進一步的執行中傳遞。所以你可以做
set -x VISUAL vim
, 並printenv
看到emacs
因為fish
兩者都執行了VISUAL=vi
並且VISUAL=emacs
只修改了第一個VISUAL
而printenv
給你第二個。但是,要發生這種事情,您需要一些東西或某人積極地試圖欺騙您,並且在仔細檢查之後,它似乎
fish
是那些確實從環境中刪除重複項(如果有)的外殼之一。