踊ろよ、fish
タイトル元ネタ
この動画の5:00ごろから
社用PCのセットアップ
ついでに今までおなじないのように使っていたLinuxコマンドもちゃんと調べたい
fishをdefault shellに設定する
Add the shell to /etc/shells with:
echo /usr/local/bin/fish | sudo tee -a /etc/shells
Change your default shell with:
chsh -s /usr/local/bin/fish
気になるところ
- echoは/usr/local/bin/fishをそのままこだましているだけ
- そういえばbinってなに?
- teeはわかんない、sudoしているから書き込みとか?
- etcって他には何が入ってるんだ、逆にetcに含まない基準はなんなんだ
- chshはchange shellっぽい
- オプションってコマンドまたいで共通点あんのかな
「/bin」「/usr/bin」「/usr/local/bin」ディレクトリの使い分けから引用
「/bin」ディレクトリには、シングルユーザモードでも利用できるコマンドを置きます。逆の言い方をすると、「/usr/bin」や「/usr/local/bin」に置かれているコマンドなどはシングルユーザモードで利用できないということになります。シングルユーザモードは、基本的にOSが壊れて正常に起動できないなど非常時に利用するものですので、「/bin」にはごく基本的かつ非常時に利用するコマンドが置かれることになります。
「/usr/bin」には、「シングルユーザモードで利用しない」かつ「RPMやdebなどのパッケージ管理システムによって、システムに管理されるコマンドやプログラム」が置かれます。非常時に利用するものではないが、システムを構成する重要なコマンドやプログラムはここに置かれることになります。
「/usr/local/bin」には、「シングルユーザモードで利用しない」かつ「RPMやdebなどのパッケージ管理システムによってシステムに管理されないコマンドやプログラム」が置かれることになります。自作のスクリプトなどはこのディレクトリに置くことが一般的です。なお、Linuxディストリビューションをインストールしたばかりのときは、このディレクトリが空であることも多いと思います。
/usr/local/binは自由枠っぽい。ほんでbinはbinaryか
teeコマンド
より引用tee コマンドは標準入力を読み取り、プログラムの出力を標準 出力に書き出すと同時に、指定されたファイルもしくは、複数のファイルにコピーします。
-aオプションはたぶんappendで、
上書きする代わりに File の終わりに出力を追加します。
とのこと。つまり/etc/shellsにfishも追加しとくよってことか。
こういうときに何を参照すればいいのかわかってない。日本語で探してるのよくないのかもしれない。
/etcディレクトリ
より引用/etcは,Linuxディストリビューションを構成する各種プログラムの設定ファイルを格納したディレクトリです。
/etcに格納されている設定ファイルは,大きく6種類に分類できます。(1)Linuxシステムの起動に関するもの,(2)システム設定全般に関連するもの,(3)ネットワーク設定,(4)サーバー・ソフトウエアに関する設定,(5)X Window Systemの設定,(6)シェルやアプリケーション・ソフトウエアに関する設定,です。シェル・スクリプトは含まれていますが,LSBの仕様により実行ファイルは格納しないことになっています
/etc/shellsは(6)に該当するってわけね
fishを追加する前の/etc/shells
/bin/bash
/bin/csh
/bin/dash
/bin/ksh
/bin/sh
/bin/tcsh
/bin/zsh
Macに最初からこんだけのshellがあるのか。bashとzshしかしらなんだ。
/etcの中身はたくさんあってそれぞれはよくわからないけど、さっきの分類のぽさはなんとなく伝わる
afpovertcp.cfg
aliases@
aliases.db
apache2/
asl/
asl.conf
auto_home
auto_master
autofs.conf
bashrc
bashrc_Apple_Terminal
com.apple.screensharing.agent.launchd
csh.cshrc
csh.login
csh.logout
cups/
defaults/
emond.d/
find.codes
ftpusers
gettytab
group
hosts
hosts.equiv
irbrc
kern_loader.conf
krb5.keytab
localtime@
locate.rc
mail.rc
man.conf
manpaths
manpaths.d/
master.passwd
networks
newsyslog.conf
newsyslog.d/
nfs.conf
notify.conf
ntp.conf
ntp_opendirectory.conf
openldap/
pam.d/
passwd
paths
paths.d/
periodic/
pf.anchors/
pf.conf
pf.os
postfix/
ppp/
profile
protocols
racoon/
rc.common
rc.netboot
resolv.conf@
rmtab
rpc
rtadvd.conf
security/
services
shells
snmp/
ssh/
ssl/
sudo_lecture
sudoers
sudoers.d/
syslog.conf
ttys
uucp/
wfs/
xtab
zprofile
zshrc
zshrc_Apple_Terminal
chshはchange shellであってるっぽい
もともと対話形式のコマンドで、-sだとと直でshellを指定できる
ユーザーも指定しなければいけないが、指定しなかったらログイン中のユーザーのシェルが変更される。
やばいハマった。
M1だと違うところに実行コマンドが収納されているらしい。記事書いてくれてありがとうございます
HomebrewでApple Siliconに対応したパッケージをインストールした際は、/opt/homebrew/bin/配下に実行コマンドが存在する
/opt/homebrew/bin/fish
ちなみに/optディレクトリって?
FHS 2.2では、/optの下にアプリケーションパッケージごとに専用のディレクトリ(以下で示す)を作ることになっています。なお、/optにはローカルシステムの管理者用に予約された6つのサブディレクトリがあります
FHSとは、Linuxの標準的なディレクトリ構成を定めた仕様のことらしい
手元の/optには/homebrewしか入ってなかった
どうでもいいけどZennのスクラップ、⌘+returnで投稿できるのまじで体験いいな。ありがとう開発者の皆様。
なんだかんだでデフォルトシェルをfishにすることができました。公式にチュートリアルがあるので色々覗いていきます
Why fish?¶
Fish is a fully-equipped command line shell (like bash or zsh) that is smart and user-friendly. Fish supports powerful features like syntax highlighting, autosuggestions, and tab completions that just work, with nothing to learn or configure.
前ちらっと調べた感じだと、zshが伝統的で高機能、fishがシンプルで平易って感じだった気がする。zshはスクリプトがsh、bashと同じ文法で、グローバルエイリアスみたい機能を盛り込んでいて、fishはシンプルな独自文法を採用していて、関数ベース?だった気が。
ふと思い出した、POSIX標準だ
~/.config/fish/functions配下に関数を書いて設定していく
fish_prompt関数でpromptを定義する
色々いじってみたけどふつうにpureに任せるのがいい気がしてきたので放置
Run help to open fish’s help in a web browser, and man with the page (like fish-language) to open it in a man page. You can also ask for help with a specific command, for example, help set to open in a web browser, or man set to see it in the terminal.
manual commandってこと?
ぽい。
The project provides manual pages in the following sections:
読んでいると登場するコマンドの由来がいちいち気になって調べちゃう
一覧にしてくださっている方が
重要そう
fishはexportコマンドをもたない。外部コマンドでアクセスできる変数をセットするにはsetの-xオプションで
> set -x MyVariable SomeValue
> env | grep MyVariable
MyVariable=SomeValue
swich文もあるらしい
switch (uname)
case Linux
echo Hi Tux!
case Darwin
echo Hi Hexley!
case FreeBSD NetBSD DragonFly
echo Hi Beastie!
case '*'
echo Hi, stranger!
end
PATHを通す便利な方法として、最初から関数が用意されているらしい
A faster way is to use the fish_add_path function, which adds given directories to the path if they aren’t already included. It does this by modifying the $fish_user_paths universal variable, which is automatically prepended to $PATH. For example, to permanently add /usr/local/bin to your $PATH, you could write:
fish_add_path /usr/local/bin
エイリアスっぽいのはconfig.fishに直接書くのがいいのかな
> cat ~/.config/fish/config.fish
set -x PATH $PATH /sbin/
function ll
ls -lh $argv
end
違うっぽい
However, it is more common and efficient to use autoloading functions and universal variables.
functions下にいちいち書けと。たしかにconfigって肥大化しがちだしソッチのほうがスッキリしそう。
When fish encounters a command, it attempts to autoload a function for that command, by looking for a file with the name of that command in ~/.config/fish/functions/.
For example, if you wanted to have a function ll, you would add a text file ll.fish to ~/.config/fish/functions:
> cat ~/.config/fish/functions/ll.fish
function ll
ls -lh $argv
end
alias設定用のラッパーファンクションも用意されてるっぽい
alias rmi="rm -i"
# This is equivalent to entering the following function:
function rmi --wraps rm --description 'alias rmi=rm -i'
rm -i $argv
end
key bindの設定は今後使いそう。
毎回読み込みたいスクリプトはconfig.fishに
extra toolsを見に行く
plugin manager
promptいじっているのは要するにここか
他のファイルもわりとわかりやすかったので、シェルスクリプトを読む練習に良さそう。
とりあえずZenn内でfishのカスタマイズについて書いている記事を読んでみる
themeはみんなbobthefish使ってて、pluginはz, peco, をマストで使っている印象。
bobthefishあまり好みでないかも...
とりあえず私用PCと同じくIcebergとpecoにしておく
ついでにVSCodeのshellもfishにしよう
今日は一旦ここまで
TODO
- 各種プラグインのインストール(特にリポジトリ管理)
- 基本的なalias
ずっとdelete keyしか押してなかったけど、単語削除はCtrl+wでできるらしい
引用元:https://qiita.com/k_uchida_____/items/c02d7317f29bc1a2db69
削除系
- Ctrl+u カーソル位置から行頭まで削除 (重要)
- Ctrl+w カーソル位置から後側にある一単語分を削除 (重要)
移動
- Ctrl+a カーソル位置を行頭へ移動 (重要)
- Ctrl+e カーソル位置を行末へ移動 (重要)
dotfilesを見て回る
plugin
これ便利そう
超絶技巧もいろいろあってすげーってなるけど、そういうのは都度必要になったら拝借する or 自作するかたちで。先に入れとくとたいてい忘れるので。
ここにツールまとまってる
エイリアス代わりのfunctionが多くて参考になりそう
ポピュラーなやつはとりあえず書いてますみたいなconfig
なんだかんだ信頼してる先輩のやつが心地よく見えてしまう。
acro5pianoさんのconfig読んでて見っけた。今はTodoistから起動させているけどこういう選択肢もありということでメモ。
擬似的にghqみたいなことしとってすごいな
そういえばこっちも気になってるんだった
とりあえず入れておくプラグインはこれらにする。特に害がなさそうで、便利で、無意識に使えそうなやつ。
pecoよりはfzfが良さそう、だけどインストールは必要性に駆られてからにする
エイリアスも一旦これだけにしておく。git関連はまた業務しながらコツコツ作っていくことにする。
alias ..='cd ..'
alias ...='cd ../..'
alias ....='cd ../../..'
alias .....='cd ../../../..'
alias ......='cd ../../../../..'
いちばん大事なドキュメント読んでなかったわ
Configurability is the root of all evilはなるほどなと思った。プログラミングをしていると「色々付け足さなくちゃいけなくなっているときは設計が間違っている」と思うことは多々あるのでなんとなく共感。
全体的にLess is Moreな感じで好みだった。現にドキュメント自体もかなりシンプル。
あとひとりで?ドキュメントの日本語をしている方が