BashユーザのためのFish

提供:MochiuWiki - SUSE, Electronic Circuit, PCB
2022年10月10日 (月) 06:36時点におけるWiki (トーク | 投稿記録)による版 (ページの作成:「== 概要 == Fishは、POSIX互換ではないため、Bash等の他のシェルとは異なる動作をするものがある。<br> <br> いずれのシェルも、基本的にコマンドラインの拡張、パイプ、リダイレクト、変数、グロブを備えており、様々な方法でコマンド出力を使用する。<br> <br><br> == コマンドの置換 == Fishはコマンド置換を、<code>$(command)</code>、または、<code>(command)</code>…」)
(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)
ナビゲーションに移動 検索に移動

概要

Fishは、POSIX互換ではないため、Bash等の他のシェルとは異なる動作をするものがある。

いずれのシェルも、基本的にコマンドラインの拡張、パイプ、リダイレクト、変数、グロブを備えており、様々な方法でコマンド出力を使用する。


コマンドの置換

Fishはコマンド置換を、$(command)、または、(command)と記述する。


変数

Fishは、setコマンドにより変数の設定や消去を行う。
また、declareコマンド、unsetコマンド、exportコマンド等の様々な個別の組み込みを行う。

例えば、setコマンドは、オプションで変数のスコープやエクスポートの可否を決定する。

 # 変数PAGERをグローバルに定義およびエクスポートすることにより、export PAGER=lessと同様になる
 set -gx PAGER less
 
 # alocalvariable=fooのように、$alocalvariableをローカルにのみ定義する
 set -l alocalvariable foo


変数を消去する。

 set -e PAGER


<変数名>=<値>文は、環境のオーバーライドとして利用できる。

 PAGER=cat git log


Fishは、単語の分割を行わないため、変数に値が設定されると、その値はそのまま維持される。
そのため、Bashのように変数の展開をダブルクオートで記述する必要はない。

 # Bashの場合
 # ダブルクォートを使用していないため、ワードスプリッティング(2行で表示)となる
 
 foo="bar baz"
 printf '%s\n' $foo
 
 # 出力
 bar
 baz


 # Fishの場合
 # 変数fooは1つの要素として設定されているため、1つの要素として渡される (1行で表示される)
 set foo "bar baz"
 printf '%s\n' $foo
 
 # 出力
 foo baz


変数は全て配列(リスト)であるため、変数を展開するとその全ての要素が展開される。
配列の各要素は、それ自身の引数となる。(Bashでいう${var[@]}と同様)

 set var "foo bar" banana
 printf '%s\n' $var
 
 # 出力
 foo bar
 banana


リストの特定の要素を選択することができます。

 echo $list[5..7]


setコマンドを使用して、コマンドの出力に変数を設定することも可能である。

 # 変数lineにfile.txtファイル内の全ての内容を設定して、1行に1つの要素を設定する
 set lines (cat file.txt)


リテラル値とコマンドを混在させて、変数に代入することも可能である。

 set numbers 1 2 3 (seq 5 8) 9
 printf '%s\n' $numbers
 
 # 出力
 1
 2
 3
 5
 6
 7
 8
 9


set <変数名> = <値>コマンドは間違ったシンタックスであり、変数に2つの値(=と<値>)を代入してしまう。