環境変数EDITORを設定してデフォルト値に変更しようとしていますが、この動作のため
/usr/bin/nano
使用できません。set -Ux
魚のよくある質問
どの設定の魚が継承されているかを確認するには? (だから変えることができます)
編集:
/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|
これは、フィッシュが開始されたときに親プロセスから得られた値であるか、またはフィッシュが内部的に変更されたかを判断するのに役立ちます。
問題が単にナノアイテムを開くためにエディタを開くことであれば、実際にエディタを設定することは何もなく、基本的に「nano」、「vim」、「emacs」、「joe」のリストを見ることは完全に可能です。背中を押して最初のゲームを開きます。この場合、set --show EDITOR
何も表示されません。
または継承され、/etc/bashrcまたは/etc/profileに設定されています。ディストリビューションは通常、ここにデフォルト値を設定します。ただgrep -r EDITOR /etc
何かを見せてください。
継承された $EDITOR があり、/etc/ に見つからない場合、実行できる作業はいくつかありますが、オペレーティングシステムに大きく依存し、移植性がありません。 Fishは親プロセスではないため、親プロセスのリストを確認する必要があります。
たとえば、Linuxには/proc/ファイルシステムがあり、NULで区切られた「var = val」フィールドを含む/ proc / $ pid / environでプロセスの環境を見つけることができます。
だからあなたはできます
- プロセスの親プロセスPIDを取得します。
- 両親の環境を見てください
- 1に移動
親プロセスのpidが0になるまで、これは親プロセスがないことを意味します(これはpid 1に初期化されます)。
簡単なスケッチで:
# 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で変数(export foo=bar
)を設定しましたが、継承された値であるため、環境に変数はありません。
したがって、ほとんどの場合、セットアッププロセスは次のようになります。後ろに継承された価値を持つ最後のもの。
ps
次の方法でプロセスについて問い合わせることができますps -p 759
(必要に応じてPIDを入力してください)。
PID TTY TIME CMD
759 pts/0 00:00:00 bash
したがって、この場合、1つのbashプロセスが変数を設定し、もう1つのbashプロセス(1305)がそれを継承します。