fish (Unix シェル)

原作者アクセル・リリエンクランツ
開発者魚殻開発者[ 1 ]
初回リリース2005年2月13日 (2005年2月13日
安定版リリース
4.4 [ 2 ] ウィキデータで編集する / 2026年2月3日
書かれたRust v4.0以降[ 3 ] 、 C++ v3.7.1まで[ 4 ]
オペレーティング·システムUnixライク
タイプUnixシェル
ライセンスGPL 2.0のみ[ 5 ]
Webサイトフィッシュシェル.com
リポジトリ

fishフレンドリーインタラクティブシェル、小文字表記)は、インタラクティブ性と使いやすさを重視したUnixライクなシェルです。fishは、高度な設定ではなく、デフォルトで豊富な機能を持つように設計されており、 [ 6 ] POSIXシェル標準には準拠していません。 [ 7 ]

特徴

fishは、ユーザーが入力するにつれて、コマンド履歴と現在のディレクトリに基づいて、増分的な候補を表示します。これはBashCtrl+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 

その他の機能

Bash/fish 翻訳テーブル

特徴Bash構文魚の構文コメント
変数の拡張:単語分割とグロブ解釈
$変数 

または

${var[@]} 

または

${var[*]} 
意図的に省略POSIX互換シェル言語のバグの主な原因として特定されている[ 12 ]
変数の展開:スカラー
「$var」 
意図的に省略すべての変数は配列である
変数の展開:配列
「${var[@]}」 
$変数 
単語分割とグロブ解釈を抑制するために引用符で囲む必要はありません。引用符で囲むことで、シリアライズが可能になります。
変数展開:スペースで区切られた文字列として
「${var[*]}」 
「$var」 
テキストエディタで行を編集するCtrl+ X、+CtrlEAlt+E呼び出されると、行入力をテキストエディタに移動する
ライン入力を評価するCtrl+ Alt+E該当なし[ 13 ]ラインエディタ上で式をその場で評価します
履歴の完了Ctrl+R暗黙
履歴置換!!意図的に省略発見できません
明示的なサブシェル
(表現) 
fish -c 式 
コマンド置換
「$(式)」 

"$(expression)"または(expression | string collect)

プロセス置換
<(式) 
(式 | 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 
envLANG=C.UTF-8python3env はスタンドアロン プログラムなので、どのシェルでも動作します。
算術
$((10/3)) 
数学「10/3」 
expr10/3expr はスタンドアロン プログラムであるため、どのシェルでも動作します。
エスケープシーケンス
$'\e'
\e 
printf'\e'両方のシェルで動作し、そのprintf組み込み関数はGNUprintfスタンドアロンプ​​ログラムと互換性があります。[ 14 ]
一重引用符で囲まれた文字列:エスケープシーケンス
「mom」最後のバックスラッシュ: \'
「mom \」の最後のバックスラッシュ: \\ '
Bashでは、シングルクォートで囲まれた文字列ではシングルクォート自体の置換のみが必要ですが、置換後の文字数は4文字です。fishでも同じ置換が行えますが、fishは通常のエスケープシーケンスをサポートしているため、バックスラッシュもエスケープする必要があります(ただし、別のバックスラッシュまたはシングルクォートの前にないシングルバックスラッシュは許可されます)。

参照

参考文献

  1. ^ 「fish shell チームメンバー」 . GitHub.com . 2025年11月10日閲覧
  2. ^ "fish 4.4.0" . 2026年2月3日. 2026年2月5日閲覧
  3. ^ 「fish-shell 4.0b1、Rust版が登場」 fishshell.com 2024年12月17日. 2024年12月18日閲覧
  4. ^ "fish 4.0.0 (2025年2月27日リリース)" . fishshell.com . 2025年8月16日閲覧
  5. ^ "ライセンス" . fishshell.com . 2025年11月10日閲覧
  6. ^ Liljencrantz, Axel (2005年5月17日). 「Fish – ユーザーフレンドリーなシェル」 . Linux Weekly News . 2010年3月24日閲覧
  7. ^ 「Fish docs: design」 . fishshell.com . 2021年4月9日閲覧
  8. ^ “Writing your own completions” . fishshell.com . 2024年8月31日時点のオリジナルよりアーカイブ2025年11月10日閲覧。
  9. ^ 「CLIマジック:fishでシェルを強化」 Linux.com 2006年11月13日2025年11月10日閲覧
  10. ^ Paul, Ryan (2005年12月19日). 「fish:フレンドリーなインタラクティブシェルの徹底解説」 . Ars Technica . 2015年3月10日閲覧。POSIX構文には、変数のスコープ、配列、関数など、いくつかの機能が欠落していたり​​、実装が不適切だったりする。そのため、fishはいくつかの重要な箇所でPOSIX構文から逸脱している。
  11. ^ 「fish_config – Webベースの設定インターフェースを起動する」 . fishshell.com . 2025年11月10日閲覧。
  12. ^ 「Bashの落とし穴」 mywiki.wooledge.org 20167月10日閲覧このページでは、Bashプログラマーが陥りやすい一般的なエラーについて説明しています。(...) 常に引用符を使用し、単語分割を一切行わないようにすれば、これらの落とし穴の多くを避けることができます。単語分割は、Bourneシェルから受け継がれた壊れたレガシーな機能であり、展開を引用符で囲まないとデフォルトで有効になります。落とし穴の大部分は、引用符で囲まれていない展開、およびその結果生じる単語分割とグロブに何らかの形で関連しています。
  13. ^ dag (2013年5月16日). 「RFC: コマンドラインでトークンを展開/評価するためのバインディングを追加する」 . GitHub . 2021年4月9日閲覧
  14. ^ Nordal, Andreas (2013年7月11日). 「printfは\eをサポートしていません」 . fish issues . 2016年3月24日閲覧