Edited at

[fish] set --append, --prepend

fish 3.0.0が2018/12/28に出ましたね。

今まで; and; orと書いていたのをそれぞれ&&||と書けるようになったなど色々な変更が加わっています。詳しくはリリースノートを見てください。

小ネタですが、set コマンドに新たに --apppend, --prependというオプションが使えるようになったので、それの紹介を行います。


TL; DR

set -x PATH $HOME/.cargo/bin $PATH

set -xp PATH $HOME/.cargo/bin

に置き換えられる。以上。


fish 3系の導入

まだ使っていない人は、https://github.com/fish-shell/fish-shell#getting-fish を参考にインストールしましょう(と書いたものの、これは入門記事ではないので他の記事を見たほうがいい気がします)。

Ubuntuかつ2系を既に使っている人は、2系のPPAを取り除いた方がよいと思うので、以下のようになるでしょうか。PPAが別なことからもわかると思いますが、後方互換性のない変更が入っているので、リリースノート等で変更を確認した上でアップグレードしてください(私は雑にアップグレードしましたが)。

sudo apt-add-repository -r ppa:fish-shell/release-2

sudo apt-add-repository ppa:fish-shell/release-3
sudo apt-get update
sudo apt-get upgrade


--prepend, -p

PATHの設定で


config.fish

set -x PATH $HOME/.cargo/bin $PATH


みたいなのはよく書くと思いますが、fish 3.0.0からは次のように書けます。


config.fish

set -x --prepend PATH $HOME/.cargo/bin

# or
set -xp PATH $HOME/.cargo/bin

一応、実行例を見せるとこんな感じです。prependはメソッド名としてもよく使われるのでお馴染みかもしれませんが、配列の先頭に挿入しているのがわかると思います。

$ set -p ARRAY AAA

$ set -p ARRAY BBB
$ set -p ARRAY CCC
$ echo $ARRAY
CCC BBB AAA


--append, -a

--prependがあれば当然、--appendもあります。最後尾に挿入していきます。

$ set -a ARRAY AAA

$ set -a ARRAY BBB
$ set -a ARRAY CCC
$ echo $ARRAY
AAA BBB CCC


おまけ

man setとすると、manページが見られますが、--appendの説明を見ると以下のように、--prependと同時に使えると書いています。


-a or --append causes the values to be appended to the current set of values for the variable. This can be used with --prepend to both append and prepend at the same time. This cannot be used when assigning to a variable slice.


実際にやってみると、確かにそうなっているようです。

$ set -ap ARRAY AAA

$ set -ap ARRAY BBB
$ echo $ARRAY
BBB AAA AAA BBB

で、一体何の役に立つんだ……。

(manに書いてあるので、実装の都合以外の何らかの意図を感じてしまう)


参考リンク