prevd、nextd、dirh コマンドで、カレントディレクトリ履歴を基に移動できる。$ sudo add-apt-repository ppa:fish-shell/release-3 $ sudo apt update $ sudo apt install fish
$ wget https://github.com/fish-shell/fish-shell/releases/download/3.1.2/fish-3.1.2.tar.gz
$ tar axvf fish-3.1.2.tar.gz
$ cd fish-3.1.2/ $ cmake -DCMAKE_INSTALL_PREFIX=$HOME/local $ make -j 4 $ make install
-DCMAKE_INSTALL_PREFIX オプションでインストール先を変える。-j 4 は並列にコンパイルするオプションであり、この場合、4 CPU を使ってコンパイルしている。環境に応じて、変更する。$ ~/local/bin/fish --version fish, version 3.1.2
if [ "$SSH_TTY" != "" ]; then BOOT_FISH=1 FISH_PATH=$HOME/local/bin/fish if [ $BOOT_FISH -eq 1 ]; then if [ -f $FISH_PATH ]; then $FISH_PATH exit fi fi fi
chsh コマンドは /etc/shells に登録されていない shell を登録することができない。BOOT_FISH が 1 のときのみ、fish-shell 環境になる。エディタで、ここを 1 以外にすれば、bash 環境になる。fish_prompt 関数で定義する。function fish_prompt printf "%s %s%s%s%s %s%s %s\n%s" (set_color -o bryellow)"["(date +"%Y/%m/%d %H:%M:%S")"]" (set_color -o green)$USER (set_color normal)"@" (set_color -o green)(hostname) (set_color -o white)"(fish)" (set_color -o blue)"["(jobs | wc -l)"]" (set_color normal)":" (set_color -o cyan)(prompt_pwd) (set_color normal)"\$ " end
[YYYY/MM/DD hh:mm:ss] USERNAME@HOSTNAME(fish) [JOB_NUBER]: CURRENT_DIR $
[2018/03/07 10:43:45] mumeiyamibito@hoge(fish) [0]: ~ $
function fish_prompt を何度も実行して、プロンプトが決まったら、funcsave fish_prompt で関数を保存するか、この関数を ~/.config/fish/config.fish に保存することで、次回起動時から設定したプロンプトが適用される。後者の方法がおすすめ。set_color コマンドで設定する。set_color [OPTION] COLOR; COMMAND
COLOR: 色名 (black, red, green, yellow, blue, magenta, cyan, white, brblack, brred, brgreen, bryellow, brblue, brmagenta, brcyan, brwhite, その他 16 進数の RGB でも指定可)OPTION-o: 太字モード (bold)-i: 斜体モード (italic)-u: 下線モード (underline)-b: background color-r: 反転モードnormal にすると色やモードがリセットされる。set コマンドを使って定義する。$ set VAR_NAME VALUE1 [VALUE2 VALUE3 ...]
VAR_NAME: 変数名VALUE1: 値VALUE をスペースで区切って指定する。$ を付けずに指定する。-g オプションを付ける。$ set -g VAR_NAME VALUE
-x オプションを付ける。$ set -x VAR_NAME VALUE
$VAR_NAME で呼び出す。$ echo $VAR_NAME
INDEX) で指定する。$ echo $VAR_NAME[INDEX]
“$VAR_NAME”, “$VAR_NAME”TEXT{} で変数全体を囲む: {$VAR_NAME}, {$VAR_NAME}TEXT${VAR_NAME} だとエラーになるため注意する。$ count $VAR_NAME
count コマンドを使って取得する。function 〜 end で囲む。function FUNC_NAME
DO_SOMETHING
end
FUNC_NAME: 関数名 (関数名の後に () や {} を付けない)DO_SOMETHING: 関数で実行するコマンド$argv で受け取る。複数の引数の場合は 1 から始まるインデックスを付けて受け取る (例: $argv[1])。FUNC_NAME
$ echo "$(cat a.txt | wc -l) + $(cat b.txt | wc -l)" | bc
a.txt の行数を wc -l コマンドでカウントする。→ 例: 100b.txt の行数を wc -l コマンドでカウントする。→ 例: 120echo で表示する。→ 例: 100 + 120bc コマンドで演算する。→ 例: 220$() は `` (バッククォーテーションで囲む) でも代用できる (ただし、ネストできない)。()) でコマンド置換をする。$ echo (cat a | wc -l)"+"(cat b | wc -l) | bc
$ string match [-a|-i|-r|-n|-v] PATTERN STRING
PATTERN: パターンSTRING: 対象文字列-a: 繰り返しマッチ-i: 大文字小文字を区別しない-r: 正規表現でパターンを指定 (デフォルトは glob (ワイルドカード))-n: マッチした位置を返す-v: 逆の結果を返す$ string length STRING
STRING: 対象文字列$ string replace [-a|-i|-r|-q|] PATTERN REPLACE STRING
PATTERN: パターンREPLACE: 置換後の文字列STRING: 対象文字列-a: 繰り返しマッチ-i: 大文字小文字を区別しない-r: 正規表現でパターンを指定 (デフォルトは glob (ワイルドカード))$ string join SEP LIST
SEP: 区切り文字LIST: 文字列リスト$ string split [-m|-r] SEP STRING
-m: 最大分割数-r: 右側から分割 (デフォルトは左側から分割)SEP: 区切り文字STRING: 対象文字列$ string trim [-l|-r|-c] STRING
-l: 左側末端の文字列を削除 (デフォルトは両端)-r: 右側末端の文字列を削除 (デフォルトは両端)-c: 削除する文字列を指定 (デフォルトは空白)STRING: 対象文字列$ string sub [-s|-l] STRING
-s: 取得する文字列の開始位置-l: 取得する文字列の長さSTRING: 対象文字列$ string escape [-n] STRING
-n: 出力結果をクォーテーションで囲まないSTRING: 対象文字列$ COMMAND > FILE
$ COMMAND >> FILE
$ COMMAND ^ FILE
$ COMMAND ^^ FILE
$ COMMAND 2>&1 | cat > FILE
$ COMMAND1 | COMMAND2
$ type -q <COMMAND>
OR
$ command -sq <COMMAND>
$status で受け取るか、; and や ; or (fish-shell 3.0 以降なら && や || でも可) でつなげて受け取る。$status を用いる $ echo $status
COMMAND1 を実行し、存在しない場合は COMMAND2 を実行する。)$ type -q <COMMAND>; and <COMMAND2>; or <COMMAND3>
fish_config コマンドで、ウェブインターフェースの設定画面が現れるので、そこで変更する。set -U | grep fish_color で表示された内容を、リモート環境でも set -U で設定していくと同じテーマになる。date コマンドなどは、使用している OS の言語で、日時のフォーマットが変わる。LANG=C を付けると良い。LANG=C を付ける。$ LANG=C date
$ env LANG=C date
{} をシングルクォートで囲んで、最後に + を付ける。$ find . -name '*.sh' -exec chmod +x '{}' +
$ find . -name '*.sh' | xargs chmod +x
() を使って優先度を変えることができない (() がコマンド置換 (bash の $()) に割り当てられているため)begin 〜 end と ; and や ; or を使うif True and not True and False: print("OK") ---> if True and not(True and False): print("OK") ---> OK
if true; and not true; and false echo "OK" ---> if true; and not begin true; and false; end echo "OK" ---> OK
protocol version mismatch -- is your shell clean? (see the rsync man page for an explanation) rsync error: protocol incompatibility (code 2) at compat.c(178) [sender=3.1.2]
config.fish から、標準出力 (echo など) を削除、あるいはコメントアウトする。config.fish の標準出力部分を if status –is-interactive … end ブロックで囲む。if status --is-interactive echo "test" end
$HOME/.config/fish/config.fish に記述する。function push-line set cl (commandline) commandline -f repaint if test -n (string join $cl) set -g fish_buffer_stack $cl commandline '' commandline -f repaint function restore_line -e fish_postexec commandline $fish_buffer_stack functions -e restore_line set -e fish_buffer_stack end end end function fish_user_key_bindings bind \cs push-line end
bind … でキーバインドを設定し、Ctrl + s で動作するようにしている。.bashrc の先頭に記述する。if [ -z "$PS1" ]; then return fi
string replace でハイフンの入ったパターンを置換できない。replace の後に – (ハイフン 2 つ) を入れる。$ string replace -- '-min' '' 'hoge-min.js' hoge.js