fish (Unix シェル)
| 魚 | |
|---|---|
魚のバージョン4.0.0 | |
| 原作者 | アクセル・リリエンクランツ |
| 開発者 | 魚殻開発者[1] |
| 初回リリース | 2005年2月13日 |
| 安定版リリース | 4.2.1 [2] / 2025年11月13日 |
| リポジトリ |
|
| 書かれた | Rust v4.0以降、[3] C++ v3.7.1まで[4] |
| オペレーティング·システム | Unixライク |
| タイプ | Unixシェル |
| ライセンス | GPL-2.0のみ[5] |
| Webサイト | fishshell.com |
fish(フレンドリーインタラクティブシェル、小文字表記)は、インタラクティブ性と使いやすさを重視したUnixライクなシェルです。fishは、高度な設定ではなく、デフォルトで豊富な機能を持つように設計されており、 [6]設計上POSIXシェル標準に準拠していません。 [7]
特徴
fishは、ユーザーが入力するにつれて、コマンド履歴と現在のディレクトリに基づいて、増分的な候補を表示します。これはBashのCtrl+R履歴検索に似ていますが、常にオンになっているため、ユーザーはコマンド入力中に継続的にフィードバックを得ることができます。fishには、ファイルパスの拡張(ワイルドカードと括弧の拡張を使用)、環境変数、コマンド固有の補完など、機能豊富なタブ補完も含まれています。オプションの説明を含むコマンド固有の補完は、ある程度はコマンドのマニュアルページから生成できますが、カスタム補完をソフトウェアに組み込んだり、シェルのユーザーが作成したりすることもできます。[8]
fishの開発者は、新しい機能を構文ではなくコマンドとして追加することを好みました。これにより、組み込み機能によりオプションやヘルプテキストを使ったコマンドの検索が可能になり、機能の発見が容易になりました。関数には人間が読める説明を含めることもできます。特別なヘルプコマンドを使用すると、ユーザーのウェブブラウザでfishのすべてのドキュメントにアクセスできます。[9]
構文
構文はPOSIX互換シェル(Bashなど)に似ているが、多くの点で異なっている[10]
# 変数の割り当て# # 変数 'foo' を値 'bar' に設定します。# fish は、本質的に空白を区別する = 演算子を使用しません。# 'set' コマンドは、配列、スコープなどにも機能するように拡張されています。> foo バーを設定> $fooをエコー バー# コマンド置換# # コマンド 'pwd' の出力を変数 'wd' に代入します。# fish はバッククォート (``) を使用しません。バッククォートはネストできず、一重引用符 (' ') と混同される可能性があります。> set wd ( pwd ) > set wd $( pwd ) # バージョン 3.4 以降> echo $wd〜# 配列変数。'A' は 5 つの値を持つ配列になります: > set A 3 5 7 9 12 # 配列のスライス。'B' は 'A' の最初の 2 つの要素になります: > set B $A [ 1 2 ] > echo $B 3 5 # 他の配列やコマンド置換出力でインデックスできます: > echo $A [( seq 3 )] 3 5 7 # 'A' の 3 番目と 5 番目の要素を消去します> set --erase A [ $B ] > echo $A 3 5 9 # for ループ、jpeg を png に変換> for i in *.jpg$i を (ベース名$i .jpg ) .png に変換して終了# fish は複数行の履歴と編集をサポートしています。# セミコロンは改行のように機能します: > for i in *.jpg ; convert $i ( basename $i .jpg ) .png ; end# whileループで/etc/passwdの行を読み取り、コロンで区切られた5番目のフィールドを出力します。これはユーザー情報です。> while read line set arr ( echo $line | tr : \n ) echo $arr [ 5 ] end < /etc/passwd# 文字列の置換(すべての i を I に置換)> string replace -a "i" "I" "Wikipedia"ウィキペディア暗黙のサブシェルなし
パイプライン、関数、ループといった言語構造は、他のシェル言語ではいわゆるサブシェルを用いて実装されています。サブシェルとは、いくつかのコマンドを実行してタスクを実行し、その後親シェルに戻る子プログラムです。この実装の詳細により、サブシェル内で行われた状態変化(変数の代入など)がメインシェルに伝播しないという副作用が一般的に生じます。fish は言語機能のためにサブシェルを作成することはありません。すべての組み込み関数は親シェル内で実行されます。
# 他の多くのシェルでは動作しません。組み込みコマンド「read」はサブシェル内で実行されるためです。Bashでは、パイプの右側には副作用がありません。kshでは以下のコマンドは動作しますが、左側には副作用がありません。fishとzshでは、両側に副作用があります。> cat *.txt | read line変数割り当ての例
この Bash の例は、見た目どおりには動作しません。ループ本体がサブシェルであるため、更新は$found永続的ではありません。
found = ''
cat /etc/fstab | while read dev mnt rest ; do if test " $mnt " = "/" ; then found = " $dev " fi done 回避策:
found = '' while read dev mnt rest ; do if test " $mnt " = "/" ; then found = " $dev " fi done < /etc/fstab 魚の例:
見つかったセット''
cat /etc/fstab | while read dev mnt rest if test " $mnt " = "/" 見つかったセット$dev end end普遍変数
fishにはユニバーサル変数と呼ばれる機能があり、これによりユーザーは、ユーザーが実行中のすべてのfishシェルで変数に永続的に値を代入することができます。変数の値はログアウトや再起動をしても記憶され、更新は実行中のすべてのシェルに即座に反映されます。
# これにより、emacsがデフォルトのテキストエディタになります。'--universal' (または '-U') は、fishにこれをユニバーサル変数にするよう指示します。> set --universal EDITOR emacs# このコマンドは、実行中のすべての fish インスタンスで、fish プロンプトの現在の作業ディレクトリ部分を青色にします。> set --universal fish_color_cwd blueその他の機能
- 高度なタブ補完 (カスタム補完の記述をサポート)。
- 広範なエラー チェックによる構文の強調表示。
- X クリップボードのサポート。
- terminfoに基づいたスマートな端末処理。
- 検索可能なコマンド履歴。
- Webベースの設定(fish_config)[11]
Bash/fish 翻訳テーブル
| 特徴 | Bash構文 | 魚の構文 | コメント |
|---|---|---|---|
| 変数の拡張: 単語分割とグロブ解釈 | $変数 または ${var[@]}または ${var[*]} | 意図的に省略 | POSIX互換シェル言語のバグの主な原因として特定されている[12] |
| 変数の展開: スカラー | 「$var」 | 意図的に省略 | すべての変数は配列である |
| 変数の展開: 配列 | 「${var[@]}」 | $変数 | 単語分割とグロブ解釈を抑制するために引用符で囲む必要はありません。引用符で囲むことで、シリアライズが可能になります。 |
| 変数展開: スペースで区切られた文字列として | 「${var[*]}」 | 「$var」 | |
| テキストエディタで行を編集する | Ctrl+ X、+CtrlE | Alt+E | 呼び出されると、行入力をテキストエディタに移動する |
| ライン入力を評価する | Ctrl+ Alt+E | — [13] | ラインエディタ上で式をその場で評価します |
| 履歴の完了 | Ctrl+R | 暗黙 | |
| 履歴置換 | !! | 意図的に省略 | 発見できません |
| 明示的なサブシェル | (表現) | fish -c 式 | |
| コマンド置換 | 「$(式)」 |
| |
| プロセス置換 | <(式) | (式 | psub) | 構文ではなくコマンド |
| 論理演算子 | !cmd && echo FAIL || echo OK | コマンドではなく、 FAILまたはOKをエコーします | |
| 変数の割り当て | 変数=値 | 変数値を設定する | |
| 文字列処理: 置換 | 「${HOME/アリス/ボブ}」 | 文字列を置換 アリス ボブ $HOME | |
| 文字列処理: プレフィックスまたはサフィックスパターンを非貪欲または貪欲に削除する | var = abc " ${ var #*. } " #bc " ${ var ##*. } " #c " ${ var %.* } " #ab " ${ var %%.* } " #a | 文字列の置換 --regex '.*?\.(.*)' '$1' abc #bc文字列の置換 --regex '.*\.(.*)' '$1' abc #c文字列の置換 --regex '(.*)\..*' '$1' abc #ab文字列の置換 --regex '(.*?)\..*' '$1' abc #a | |
| エクスポート変数 | エクスポート変数 | --export 変数を設定する | タブ補完で発見できるオプション |
| 関数ローカル変数 | ローカル変数 | デフォルトで | |
| スコープローカル変数 | 同等のものはありません | --local 変数を設定する | |
| 変数を削除する | 変数を設定解除 | --erase 変数を設定する | |
| 変数が存在するかどうかを確認する | テスト -v 変数 | --query 変数を設定する | |
| 配列の初期化 | var=(abc) | 変数abcを設定する | すべての変数は配列である |
| 配列の反復 | for i in " ${ var [@] } " ; do echo " $i " done | $var内の iをエコーし $i を終了 | |
| 引数ベクトル: すべての引数 | 「$@」 | $引数 | |
| 引数ベクトル: インデックス | 「$1」 | $argv[1] | |
| 引数ベクトル: 長さ | $# | ($argvを数える) | |
| 引数ベクトル: シフト | シフト | --erase 引数を設定する[ 1 ] | |
| 環境変数における配列表現 | PATH = " $PATH : $HOME /.local/bin" | PATH $PATH $HOME /.local/binを設定する | fishは、変数と環境変数を変換する際に、コロンを配列の区切り文字として扱います。これは、$PATHや$LS_COLORSといった、多くの配列型の環境変数と整合しています。 |
| エクスポートして実行 | LANG=C.UTF-8 python3 | 環境変数LANG = C.UTF-8 python3 | env LANG=C.UTF-8 python3env はスタンドアロン プログラムなので、どのシェルでも動作します。 |
| 算術 | $((10/3)) | 数学「10/3」 | expr 10 / 3expr はスタンドアロン プログラムであるため、どのシェルでも動作します。 |
| エスケープシーケンス | $'\e' | \e | printf '\e'両方のシェルで動作し、そのprintf組み込み関数はGNUprintfスタンドアロンプログラムと互換性があります。[14] |
| 一重引用符で囲まれた文字列: エスケープシーケンス | 「mom」の最後のバックスラッシュ: \' | 「mom \」の最後のバックスラッシュ: \\ ' | Bashでは、シングルクォートで囲まれた文字列ではシングルクォート自体の置換のみが必要ですが、置換後の文字数は4文字です。fishでも同じ置換が行えますが、fishは通常のエスケープシーケンスをサポートしているため、バックスラッシュもエスケープする必要があります(ただし、別のバックスラッシュまたはシングルクォートの前にないシングルバックスラッシュは許可されます)。 |
参照
参考文献
- ^ “fish shell チームメンバー”. GitHub.com . 2025年11月10日閲覧。
- ^ “リリース 4.2.1”. 2025年11月13日. 2025年11月13日閲覧。
- ^ 「fish-shell 4.0b1、Rust版が登場」fishshell.com 2024年12月17日. 2024年12月18日閲覧。
- ^ “fish 4.0.0 (2025年2月27日リリース)”. fishshell.com . 2025年8月16日閲覧。
- ^ “ライセンス”. fishshell.com . 2025年11月10日閲覧。
- ^ Liljencrantz, Axel (2005年5月17日). 「Fish – ユーザーフレンドリーなシェル」. Linux Weekly News . 2010年3月24日閲覧。
- ^ “Fish docs: design”. fishshell.com . 2021年4月9日閲覧。
- ^ “Writing your own completions”. fishshell.com . 2024年8月31日時点のオリジナルよりアーカイブ。2025年11月10日閲覧。
- ^ 「CLIマジック:fishでシェルを強化」Linux.com 2006年11月13日. 2025年11月10日閲覧。
- ^ Paul, Ryan (2005年12月19日). 「fish:フレンドリーなインタラクティブシェルの徹底解説」Ars Technica . 2015年3月10日閲覧。POSIX
構文には、変数のスコープ、配列、関数など、いくつかの機能が欠落していたり、実装が不適切だったりする。そのため、fishはいくつかの重要な箇所でPOSIX構文から逸脱している。
- ^ 「fish_config – ウェブベースの設定インターフェースを起動する」fishshell.com . 2025年11月10日閲覧。
- ^ 「Bashの落とし穴」。mywiki.wooledge.org 。2016年7月10日閲覧。
このページでは、Bashプログラマーが陥りやすい一般的なエラーについて説明しています。(...) 常に引用符を使用し、単語分割を一切行わないようにすれば、これらの落とし穴の多くを避けることができます。単語分割は、Bourneシェルから受け継がれた壊れたレガシーな機能であり、展開を引用符で囲まないとデフォルトで有効になります。落とし穴の大部分は、引用符で囲まれていない展開、およびその結果生じる単語分割とグロブに何らかの形で関連しています。
- ^ dag (2013年5月16日). 「RFC: コマンドラインでトークンを展開/評価するためのバインディングを追加する」. GitHub . 2021年4月9日閲覧。
- ^ Nordal, Andreas (2013年7月11日). 「printfは\eをサポートしていません」. fish issues . 2016年3月24日閲覧。
外部リンク
- 公式サイト – ドキュメントとダウンロードを含む
- GitHubの fish-shell (アクティブ)
- 「魚」。Gitorious . 2011年7月26日時点のオリジナルよりアーカイブ。(廃止)
- SourceForgeの fish / fish (廃止)
- fish-users – 魚ユーザーのための一般的なディスカッションリスト
- Shell Translation Dictionary – 別の Bash/fish 翻訳テーブル