Closed50

踊ろよ、fish

hajimismhajimism

ついでに今までおなじないのように使っていたLinuxコマンドもちゃんと調べたい

hajimismhajimism

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

hajimismhajimism

気になるところ

  • echoは/usr/local/bin/fishをそのままこだましているだけ
  • そういえばbinってなに?
  • teeはわかんない、sudoしているから書き込みとか?
  • etcって他には何が入ってるんだ、逆にetcに含まない基準はなんなんだ
  • chshはchange shellっぽい
  • オプションってコマンドまたいで共通点あんのかな
hajimismhajimism

「/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か

hajimismhajimism

teeコマンド
https://www.ibm.com/docs/ja/aix/7.1?topic=t-tee-command
より引用

tee コマンドは標準入力を読み取り、プログラムの出力を標準 出力に書き出すと同時に、指定されたファイルもしくは、複数のファイルにコピーします。

-aオプションはたぶんappendで、

上書きする代わりに File の終わりに出力を追加します。

とのこと。つまり/etc/shellsにfishも追加しとくよってことか。

hajimismhajimism

こういうときに何を参照すればいいのかわかってない。日本語で探してるのよくないのかもしれない。

hajimismhajimism

/etcディレクトリ
https://xtech.nikkei.com/it/article/Keyword/20071122/287804/
より引用

/etcは,Linuxディストリビューションを構成する各種プログラムの設定ファイルを格納したディレクトリです。

/etcに格納されている設定ファイルは,大きく6種類に分類できます。(1)Linuxシステムの起動に関するもの,(2)システム設定全般に関連するもの,(3)ネットワーク設定,(4)サーバー・ソフトウエアに関する設定,(5)X Window Systemの設定,(6)シェルやアプリケーション・ソフトウエアに関する設定,です。シェル・スクリプトは含まれていますが,LSBの仕様により実行ファイルは格納しないことになっています

/etc/shellsは(6)に該当するってわけね

hajimismhajimism

fishを追加する前の/etc/shells

/bin/bash
/bin/csh
/bin/dash
/bin/ksh
/bin/sh
/bin/tcsh
/bin/zsh

Macに最初からこんだけのshellがあるのか。bashとzshしかしらなんだ。

hajimismhajimism

/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

hajimismhajimism

https://eng-entrance.com/linux-command-chsh

chshはchange shellであってるっぽい
もともと対話形式のコマンドで、-sだとと直でshellを指定できる
ユーザーも指定しなければいけないが、指定しなかったらログイン中のユーザーのシェルが変更される。

hajimismhajimism

やばいハマった。
M1だと違うところに実行コマンドが収納されているらしい。記事書いてくれてありがとうございます
https://zenn.dev/meihei/articles/390d6dbbb4c936

HomebrewでApple Siliconに対応したパッケージをインストールした際は、/opt/homebrew/bin/配下に実行コマンドが存在する
/opt/homebrew/bin/fish

hajimismhajimism

ちなみに/optディレクトリって?
https://atmarkit.itmedia.co.jp/ait/articles/0109/07/news002.html

FHS 2.2では、/optの下にアプリケーションパッケージごとに専用のディレクトリ(以下で示す)を作ることになっています。なお、/optにはローカルシステムの管理者用に予約された6つのサブディレクトリがあります

FHSとは、Linuxの標準的なディレクトリ構成を定めた仕様のことらしい
https://linuc.org/study/knowledge/503/

手元の/optには/homebrewしか入ってなかった

hajimismhajimism

どうでもいいけどZennのスクラップ、⌘+returnで投稿できるのまじで体験いいな。ありがとう開発者の皆様。

hajimismhajimism

なんだかんだでデフォルトシェルをfishにすることができました。公式にチュートリアルがあるので色々覗いていきます

hajimismhajimism

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はシンプルな独自文法を採用していて、関数ベース?だった気が。

hajimismhajimism

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ってこと?

hajimismhajimism

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
hajimismhajimism

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

hajimismhajimism

エイリアスっぽいのはconfig.fishに直接書くのがいいのかな

> cat ~/.config/fish/config.fish

set -x PATH $PATH /sbin/

function ll
    ls -lh $argv
end
hajimismhajimism

違うっぽい

However, it is more common and efficient to use autoloading functions and universal variables.

hajimismhajimism

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
hajimismhajimism
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

hajimismhajimism

今日は一旦ここまで

TODO

  • 各種プラグインのインストール(特にリポジトリ管理)
  • 基本的なalias
hajimismhajimism

ずっとdelete keyしか押してなかったけど、単語削除はCtrl+wでできるらしい
引用元:https://qiita.com/k_uchida_____/items/c02d7317f29bc1a2db69

削除系

  • Ctrl+u カーソル位置から行頭まで削除 (重要)
  • Ctrl+w カーソル位置から後側にある一単語分を削除 (重要)

移動

  • Ctrl+a カーソル位置を行頭へ移動 (重要)
  • Ctrl+e カーソル位置を行末へ移動 (重要)
hajimismhajimism

dotfilesを見て回る

plugin
https://github.com/caarlos0/dotfiles.fish/blob/main/fish/plugins#L1-L6

これ便利そう
https://github.com/paulirish/dotfiles/blob/main/fish/aliases.fish#L2-L8

超絶技巧もいろいろあってすげーってなるけど、そういうのは都度必要になったら拝借する or 自作するかたちで。先に入れとくとたいてい忘れるので。

ここにツールまとまってる
https://github.com/jorgebucaran/awsm.fish

hajimismhajimism

エイリアスも一旦これだけにしておく。git関連はまた業務しながらコツコツ作っていくことにする。

alias ..='cd ..'
alias ...='cd ../..'
alias ....='cd ../../..'
alias .....='cd ../../../..'
alias ......='cd ../../../../..'
hajimismhajimism

いちばん大事なドキュメント読んでなかったわ
https://fishshell.com/docs/current/design.html

Configurability is the root of all evilはなるほどなと思った。プログラミングをしていると「色々付け足さなくちゃいけなくなっているときは設計が間違っている」と思うことは多々あるのでなんとなく共感。
全体的にLess is Moreな感じで好みだった。現にドキュメント自体もかなりシンプル。

このスクラップは2022/12/11にクローズされました