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
コマンドでカウントする。→ 例: 100
b.txt
の行数を wc -l
コマンドでカウントする。→ 例: 120
echo
で表示する。→ 例: 100 + 120
bc
コマンドで演算する。→ 例: 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