UbuntuのパッケージをアップデートしたらFish shellがエラーを吐くようになった
最近(2020/02/25)、Ubuntuのアップデートリクエストに従ってアップデートを行ったところ、Fish shellの起動時に次のようなエラーが発生するようになった。aptの履歴によるとfish shellが更新されている。
発生しているエラー
~/.config/fish/functions/fish_prompt.fish (line 162): Expected a string, but instead found a '&'
git rev-parse --quiet --verify HEAD > /dev/null ^&1; or set empty 1
^
from sourcing file ~/.config/fish/functions/fish_prompt.fish
in command substitution
source: Error while reading file '/home/dev-user/.config/fish/functions/fish_prompt.fish'
Welcome to fish, the friendly interactive shell
また、エラーだけでなく、プロンプトも次のようにいつもと違う表示になっている。
dev-user@thinkpad /home/dev-user >
自分の環境の場合、$HOMEにいるときは「 > 」のようにシンプルに表示されるのが正しい。
環境
Ubuntu 18.04.4 LTS
fish-common:amd64 (3.0.2-1~bionic, 3.1.0-1~bionic)
fish:amd64 (3.0.2-1~bionic, 3.1.0-1~bionic)
ThinkPad X1C 2017にUbuntuをデスクトップOSとしてネイティブインストールしています。
ターミナルソフトはterminator 1.91を使っています。
応急処置
原因と思われる
~/.config/fish/functions/fish_prompt.fish
の162行目は次のようになっている。
git rev-parse --quiet --verify HEAD > /dev/null ^&1; or set empty 1
「^&1」の部分が問題の様子。
fishで「^」はエラー出力を表しているようなので(参照)、ディスクリプタの合成をやろうとしてミスしているのだろうと想像して次のように変更。
git rev-parse --quiet --verify HEAD > /dev/null 2>&1; or set empty 1
とりあいず、エラーは消えている。
解釈
今回はエラー出力を標準出力に合成し、その結果をnullに渡すことによってすべての出力を非表示にして対応した。試しに標準出力を消さないパターンに変更したところ、フォルダを移動するたびにgit rev-parse ~~のコマンドが実行され、HEADと差分があるgit管理下のディレクトリではリビジョンなのかハッシュ文字列のようなものが表示されるようになった。プロンプトにそんな表示が現れるのはおかしな状況のため、エラー出力も含めて非表示にするのが実装者の意図だったのだと想像して上記対応を行ったけれど、あくまでご利用は自己責任で。