差分
このページの2つのバージョン間の差分を表示します。
両方とも前のリビジョン 前のリビジョン 次のリビジョン | 前のリビジョン | ||
fish-shell [2018/05/23 16:41] – [環境変数を一時的に変更する] mumeiyamibito | fish-shell [2023/05/12 15:15] (現在) – [rsync や scp で fish をインストールしたリモートサーバにファイルを転送できない (旧方法)] mumeiyamibito | ||
---|---|---|---|
行 3: | 行 3: | ||
* シェル言語の一つ | * シェル言語の一つ | ||
* zsh 並の補完機能がある | * zsh 並の補完機能がある | ||
+ | * さらに予測機能 (tab を押さなくても履歴機能を表示) がある | ||
* 軽量 | * 軽量 | ||
+ | * '' | ||
+ | |||
+ | ===== インストール ===== | ||
+ | * 最新版をインストールする\\ <code bash> | ||
+ | $ sudo add-apt-repository ppa: | ||
+ | $ sudo apt update | ||
+ | $ sudo apt install fish | ||
+ | </ | ||
+ | |||
+ | * 共用サーバ等でホームディレクトリにインストールする ($HOME/ | ||
+ | - cmake のバージョンが 3.2 以上でない場合、cmake をインストールする。 | ||
+ | * [[サーバ関連/ | ||
+ | - 最新版のソースをダウンロードする。\\ <code bash> | ||
+ | $ wget https:// | ||
+ | </ | ||
+ | - ソースを展開する。\\ <code bash> | ||
+ | $ tar axvf fish-3.1.2.tar.gz | ||
+ | </ | ||
+ | - インストールする。\\ <code bash> | ||
+ | $ cd fish-3.1.2/ | ||
+ | $ cmake -DCMAKE_INSTALL_PREFIX=$HOME/ | ||
+ | $ make -j 4 | ||
+ | $ make install | ||
+ | </ | ||
+ | * cmake の '' | ||
+ | * 参考サイト: | ||
+ | * '' | ||
+ | - インストールされたか確認する。\\ <code bash> | ||
+ | $ ~/ | ||
+ | fish, version 3.1.2 | ||
+ | </ | ||
+ | - .bashrc の末尾に追記する。\\ <code bash> | ||
+ | if [ " | ||
+ | BOOT_FISH=1 | ||
+ | FISH_PATH=$HOME/ | ||
+ | if [ $BOOT_FISH -eq 1 ]; then | ||
+ | if [ -f $FISH_PATH ]; then | ||
+ | $FISH_PATH | ||
+ | exit | ||
+ | fi | ||
+ | fi | ||
+ | fi | ||
+ | </ | ||
+ | * '' | ||
+ | * 参考サイト: | ||
+ | * '' | ||
+ | * bash が一度起動しているため、環境変数は引き継がれる。 | ||
+ | * rsync や scp が転送できない対策として、SSH_TTY の if 文を追加した (2020/ | ||
+ | * 参考サイト: | ||
+ | - 再ログインする。 | ||
+ | |||
===== 環境設定 ===== | ===== 環境設定 ===== | ||
行 123: | 行 175: | ||
* リダイレクト | * リダイレクト | ||
* 標準出力\\ <code bash>$ COMMAND > FILE</ | * 標準出力\\ <code bash>$ COMMAND > FILE</ | ||
- | * 標準出力 (追記)\\ <code bash> | + | * 標準出力 (追記)\\ <code bash>$ COMMAND >> FILE</ |
- | * 標準エラー\\ <code bash> | + | * 標準エラー\\ <code bash>$ COMMAND ^ FILE</ |
- | * 標準エラー (追記)\\ <code bash> | + | * 標準エラー (追記)\\ <code bash>$ COMMAND ^^ FILE</ |
- | * 標準出力と標準エラーを同時出力\\ <code bash> | + | * 標準出力と標準エラーを同時出力\\ <code bash>$ COMMAND 2>&1 | cat > FILE</ |
* パイプ (通常のシェルと同じ)\\ < | * パイプ (通常のシェルと同じ)\\ < | ||
+ | ==== コマンドが存在するか調べる ==== | ||
+ | * 2 通りのコマンドがある\\ <code bash>$ type -q < | ||
+ | * 結果は、'' | ||
+ | * 成否を受け取るなら、'' | ||
+ | * 続けて、コマンド (コマンドが存在する場合は '' | ||
+ | * 参考サイト: | ||
+ | * [[https:// | ||
+ | * [[https:// | ||
行 134: | 行 194: | ||
==== テーマを切り替える ==== | ==== テーマを切り替える ==== | ||
* '' | * '' | ||
+ | * リモート環境でウェブインターフェースが使えない場合は、'' | ||
+ | * [[https:// | ||
==== 環境変数を一時的に変更する ==== | ==== 環境変数を一時的に変更する ==== | ||
行 145: | 行 207: | ||
==== find コマンドの exec が使えない ==== | ==== find コマンドの exec が使えない ==== | ||
- | * 対策: '' | + | * 対策1: '' |
- | * 参考サイト: | + | * 参考サイト: |
+ | * 対策2: find の結果を xargs で処理する。\\ 例: <code bash>$ find . -name ' | ||
+ | |||
+ | ==== if 文で優先順位のある複数の条件を扱う ==== | ||
+ | * fish-shell では if 文の条件で '' | ||
+ | * 対策: '' | ||
+ | * 例: | ||
+ | * Python での表記\\ <code python> | ||
+ | if True and not True and False: | ||
+ | print(" | ||
+ | ---> | ||
+ | if True and not(True and False): | ||
+ | print(" | ||
+ | ---> OK | ||
+ | </ | ||
+ | * fish-shell での表記\\ <code bash> | ||
+ | if true; and not true; and false | ||
+ | echo " | ||
+ | ---> | ||
+ | if true; and not begin true; and false; end | ||
+ | echo " | ||
+ | ---> OK | ||
+ | </ | ||
+ | * 参考サイト: | ||
+ | |||
+ | ==== fish-shell を導入したリモートに rsync や scp でアクセスできない ==== | ||
+ | * 【症状】fish-shell を導入したリモートに rsync や scp でファイルを転送しようとすると以下のエラーメッセージが表示される\\ < | ||
+ | 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] | ||
+ | </ | ||
+ | * 【原因】リモートに ssh にログインした際に、標準出力 (リモートサーバの状況やグリーティングなど) されるものがある場合にエラーになるらしい (bash など他のシェルでも同様の原因の問題があるらしい)。 | ||
+ | * 【解決方法】 | ||
+ | * ログイン時に実行される '' | ||
+ | * ログイン時に実行される '' | ||
+ | * 対話シェルの時のみ表示するようにする。 | ||
+ | * 例: \\ <code bash> | ||
+ | if status --is-interactive | ||
+ | echo " | ||
+ | end | ||
+ | </ | ||
+ | * 参考サイト: | ||
+ | |||
+ | |||
+ | |||
+ | ==== コマンドラインスタック ==== | ||
+ | * とても役立つテクニックで、buffer stack とも呼ばれるらしい…。 | ||
+ | * 長いコマンドを打っている時に、ヘルプオプションを見たくなった時に便利。 | ||
+ | * 長いコマンドを打っている時に、やり忘れたコマンドを実行したくなった時に便利。 | ||
+ | * つまり、現在の入力中のコマンドを一時的に退避させる方法。 | ||
+ | * 方法: | ||
+ | * 以下の関数を '' | ||
+ | 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 | ||
+ | </ | ||
+ | * 最後の '' | ||
+ | * 参考サイト: | ||
+ | |||
+ | |||
+ | ==== rsync や scp で fish をインストールしたリモートサーバにファイルを転送できない (旧方法) ==== | ||
+ | * '' | ||
+ | if [ -z " | ||
+ | return | ||
+ | fi | ||
+ | </ | ||
+ | * .bashrc で何らかの処理がされている場合、scp や rsync が進行しないエラーが発生するため、.bashrc がこれらのコマンドで読み込まれた際、対話モードでない場合は即座に終了するようにする。 | ||
+ | * 参考サイト: | ||
+ | |||
+ | |||
+ | ==== ハイフンの入った文字列の置換ができない ==== | ||
+ | * 問題: '' | ||
+ | * 解決策: '' | ||
+ | * 例: <code bash> | ||
+ | $ string replace -- ' | ||
+ | hoge.js | ||
+ | </ | ||
+ | * 参考サイト: | ||
===== 参考サイト ===== | ===== 参考サイト ===== | ||
* [[http:// | * [[http:// | ||
- | {{tag> | + | {{tag> |