kachick / times_kachick

`#times_kachick channel in chat` as a public repository. Personal Note and TODOs
https://github.com/kachick/times_kachick/issues?q=is%3Aissue+is%3Aclosed
6 stars 0 forks source link

2023-07-26 - Nix flake + direnv や nix develop で PATH 展開した bash/zsh/fish から、更に bash をインタラクティブに立ち上げると `bash: complete: command not found` が出まくって不快 #237

Closed kachick closed 1 year ago

kachick commented 1 year ago

覚えれば覚えるほどあれもこれも便利な Nix 環境だけど、使ってくうち必ず何かしらに躓く。しかしメリットの方が大きいのでやめる気には全くならない 今はこれ https://github.com/NixOS/nix/issues/6091 に引っかかっている。 https://github.com/NixOS/nix/pull/7010 で直ったはずと閉じられているが・・・?

https://github.com/direnv/direnv/issues/443 も関係しているのかよくわからない

結局今は bash を普段遣いにはしていない のだけれど、シェルスクリプト書く時とか bash での挙動を確認したい事は多く、その時に使えないと困る。 基本使わないと考えて complete 系を .bashrc でごそっとコメントアウトしたらエラーは止まったけど、表示がバグる

kachick commented 1 year ago

bash --norc で、 bashrc を一時的に読み込まず起動するのが一番良さげに感じている。これなら親から渡ってきた nix で通った path は維持されたまま、nix が用意する bash 上で、補完やプロンプトだけ飛ばした bash 環境で動作させられる。 スクリプトでの挙動にもかなり近くなるはずでは

bash --noprofile --norc で profile を飛ばす必要性はまだ感じてない

env -i bash --norc --noprofile と env から始めると、そもそも nix が通した bash ではなくシステムの bash が立ち上がる。ここには他の Nix 関係の PATH も通ってないので、使いたいシーンはあんまなさそうな。

ref: https://stackoverflow.com/a/21391035/1212807

kachick commented 1 year ago

しかし面倒ではあるので、 bashrc 内で Nix devshell 上かを判別して読み込ませる読み込ませないを分ければどうか?

そもそも Nix 環境かどうかを判別する手法が微妙に無さげだったけど、 starship がうまいこと表示してくれてるのでそっち追っかけて合わせれば良い気がする。適当に NIX_ なんたらで通る ENV で判別してそうな気はするけど

kachick commented 1 year ago

https://github.com/starship/starship/blob/6fc4152624ffbfb9dbb4aaf09a382f4b05afe25c/src/modules/nix_shell.rs#L18

IN_NIX_SHELL で判別してた。direnv が展開する中になさそうなんだが・・・? https://github.com/NixOS/nix/issues/3862 で議論されてたときにも上がってたENV名だけど、結局これは採用されずに close されてた気が・・・

https://github.com/starship/starship/pull/4724 starship で入ったのはこれかー

https://github.com/NixOS/nix/issues/3862#issuecomment-1611837272 マジカルな何かが書いてありきになる

kachick commented 1 year ago

要は nix で path 展開された shell 上から更に nix が提供する bash を立ち上げた時限定の話という理解をしたので、 https://github.com/kachick/dotfiles/pull/181 こんな感じにしておいた。

不便といえば不便だけれど、そもそも bash は便利にするというよりある程度安定して動くよう諸々は突っ込まないほうが良いのかもしれない・・・(それが dash だったんちゃうんかとは思いつつ)

kachick commented 1 year ago

相変わらず何もわかってないことがわかったけれど、nixpkgs で bash と現在名付けられている pkg は、一般的に僕らが触れる様な GNU Readline を含めない状態の配布物らしい。なのでシェルスクリプトの類は動くが、もろもろ interactive な機能がおかしくなると ということで、bash という名前が readline 込みの物をポイントするようにすれば問題なくなり、その名前は bashInteractive らしい。

https://github.com/NixOS/nix/issues/730#issuecomment-162323824 => https://github.com/kachick/anylang-template/commit/92ad474bb92dfedbe31e53e9190c10ce1cda4325

これでゴリゴリ回避するような変なコードは捨てられたけれど、しかし各リポジトリにこれ明記する必要あるの面倒では。自分のだったらまだ良いけど、人のとこ行った時面倒だな・・・と思って home-manager 側でも入れてしまったが、結局 dev shell あげる時に nix が 専用 bash を押し付けてくるし、それが優先されるので解消せんかった。

kachick commented 1 year ago

過去にも幾つも issue 上がってるので、そのうちなんかオフィシャルに方向性が示されるかもしれないし、特にそういう必要性無しという結論になるのかもしれない。

最新と思しき問題提起は https://github.com/NixOS/nix/issues/8764