MochiuWiki : SUSE, EC, PCB
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
ツール
リンク元
関連ページの更新状況
特別ページ
ページ情報
We ask for
Donations
検索
個人用ツール
ログイン
Toggle dark mode
名前空間
ページ
議論
表示
閲覧
ソースを閲覧
履歴を表示
BashユーザのためのFishのソースを表示
提供: MochiuWiki : SUSE, EC, PCB
←
BashユーザのためのFish
あなたには「このページの編集」を行う権限がありません。理由は以下の通りです:
この操作は、次のグループのいずれかに属する利用者のみが実行できます:
管理者
、new-group。
このページのソースの閲覧やコピーができます。
== 概要 == Fishは、POSIX互換ではないため、Bash等の他のシェルとは異なる動作をするものがある。<br> <br> いずれのシェルも、基本的にコマンドラインの拡張、パイプ、リダイレクト、変数、グロブを備えており、様々な方法でコマンド出力を使用する。<br> <br><br> == コマンドの置換 == Fishはコマンド置換を、<code>$(command)</code>、または、<code>(command)</code>と記述する。<br> <br> また、Fishには、<code>$IFS</code>は存在せず、改行で分割する。<br> それ以外の方法で分割する場合は、<code>split</code>コマンド、<code>string split0</code>コマンド、<code>string collect</code>コマンドのいずれかを使用する。<br> <br> 詳細は、[[Fishの基礎 - 繰り返し文#for文]]を参照すること。<br> <br><br> == 変数 == Fishは、<code>set</code>コマンドにより変数の設定や消去を行う。<br> また、<code>declare</code>コマンド、<code>unset</code>コマンド、<code>export</code>コマンド等の様々な個別の組み込みを行う。<br> <br> 例えば、<code>set</code>コマンドは、オプションで変数のスコープやエクスポートの可否を決定する。<br> <syntaxhighlight lang="fish"> # 変数PAGERをグローバルに定義およびエクスポートすることにより、export PAGER=lessと同様になる set -gx PAGER less # alocalvariable=fooのように、$alocalvariableをローカルにのみ定義する set -l alocalvariable foo </syntaxhighlight> <br> 変数を消去する。<br> <syntaxhighlight lang="fish"> set -e PAGER </syntaxhighlight> <br> <code><変数名>=<値></code>文は、環境のオーバーライドとして利用できる。<br> <syntaxhighlight lang="fish"> PAGER=cat git log </syntaxhighlight> <br> Fishは、単語の分割を行わないため、変数に値が設定されると、その値はそのまま維持される。<br> そのため、Bashのように変数の展開をダブルクオートで記述する必要はない。<br> <syntaxhighlight lang="bash"> # Bashの場合 # ダブルクォートを使用していないため、ワードスプリッティング(2行で表示)となる foo="bar baz" printf '%s\n' $foo # 出力 bar baz </syntaxhighlight> <br> <syntaxhighlight lang="fish"> # Fishの場合 # 変数fooは1つの要素として設定されているため、1つの要素として渡される (1行で表示される) set foo "bar baz" printf '%s\n' $foo # 出力 foo baz </syntaxhighlight> <br> 変数は全て配列(リスト)であるため、変数を展開するとその全ての要素が展開される。<br> 配列の各要素は、それ自身の引数となる。(Bashでいう<code>${var[@]}</code>と同様)<br> <syntaxhighlight lang="fish"> set var "foo bar" banana printf '%s\n' $var # 出力 foo bar banana </syntaxhighlight> <br> リストの特定の要素を選択することができます。<br> <syntaxhighlight lang="fish"> echo $list[5..7] </syntaxhighlight> <br> <code>set</code>コマンドを使用して、コマンドの出力に変数を設定することも可能である。<br> <syntaxhighlight lang="fish"> # 変数lineにfile.txtファイル内の全ての内容を設定して、1行に1つの要素を設定する set lines (cat file.txt) </syntaxhighlight> <br> リテラル値とコマンドを混在させて、変数に代入することも可能である。<br> <syntaxhighlight lang="fish"> set numbers 1 2 3 (seq 5 8) 9 printf '%s\n' $numbers # 出力 1 2 3 5 6 7 8 9 </syntaxhighlight> <br> <code>set <変数名> = <値></code>コマンドは間違ったシンタックスであり、変数に2つの値(=と<値>)を代入してしまう。<br> <br><br> == ワイルドカード == Fishは、構文として*グロブおよび**グロブ(および非推奨の?グロブ)のみをサポートしている。<br> ただし、<code>for</code>文、<code>set</code>、<code>count</code>、グロブが変数オーバーライド(<code>set VAR *</code>文等)が使用されている場合は、(Bashの<code>nullglob</code>オプションのように)何もない状態に展開される。<br> <br> グロブは展開された変数では適用されないため、以下に示すような記述は、どのファイルにもマッチしない。<br> <syntaxhighlight lang="fish"> set foo "*" echo $foo </syntaxhighlight> <br> 引用符で囲まれていない<code>*</code>、または、<code>?</code>が含まれている場合、それをワイルドカードとして使用することができる。<br> * * *: ファイル名に含まれる任意の文字数(0を含む)にマッチする。(<code>/</code>は含まれない) *: <br> * ** *: 任意の数の文字(0を含む)に再帰的にマッチする。(サブディレクトリは降順) *: 自身のセグメントである場合は、他のシェルとの互換性のために、そのセグメントもマッチする可能性がある。 *: <br> * ? *: /以外の任意の1文字にマッチする。 *: ただし、<code>?</code>の使用は非推奨であり、qmark-noglob機能フラグで無効にできるため、<code>?</code>は通常の文字として扱うことができる。 <br> ワイルドカードのマッチは、大文字小文字を区別せずにソートされる。<br> 数字を含むマッチをソートする場合、それらは自然にソートされて、'1'、'5'、'12'という文字列は1,5,12のようにソートされる。<br> <br> 隠しファイル(名前がドットで始まるもの)は、ワイルドカードの文字列がその場所にドットを持たない限り、ワイルドカードを使用する際に考慮されない。<br> <br> * a* *: 現在のディレクトリにある'a'で始まる全てのファイルにマッチする。 *: <br> * ** *: カレントディレクトリとそのサブディレクトリにある全てのファイルとディレクトリにマッチする。 *: <br> * ~/.* *: ホームディレクトリにある全ての隠しファイルとディレクトリにマッチする。 <br> 多くのコマンドでは、ワイルドカードの展開に失敗する時、コマンドは実行されずに環境変数<code>status</code>が<code>0</code>以外に設定されて、警告が表示される。<br> この動作は、Bashが<code>shopt -s failglob</code>で行うのと同様である。<br> <br> 例外として、<code>set</code>、<code>path</code>、<code>overrides</code>文での変数のオーバーライド、<code>count</code>文、<code>for</code>文がある。<br> これらのグロブは、Bashの<code>shopt -s nullglob</code>のように、引数ゼロに展開される。<br> <syntaxhighlight lang="fish"> # .txtファイルをリストアップして、存在しない場合は警告を表示する ls *.txt </syntaxhighlight> <br> <syntaxhighlight lang="fish"> # .txtファイルが存在する場合は、その一覧を表示する set foos *.txt if count $foos >/dev/null ls $foos end </syntaxhighlight> <br> Bashとは異なり、Fishは(デフォルトでは)マッチしない場合、リテラルなグロブ文字を渡さないため、<br> <code>find</code>コマンドや<code>sudo zypper install</code>のようにマッチング自体を行うコマンドでは、引用符を追加する必要がある。<br> <syntaxhighlight lang="fish"> sudo zypper install "ncurses-*" find . -iname "*.txt" </syntaxhighlight> <br><br> == 引用符 == Fishには、2つの引用符<code>""</code>と<code><nowiki>''</nowiki></code>がある。<br> 変数はダブルクォートで展開されて、引用符が無い場合はシングルクォートで展開される。<br> <br> また、<code>$''</code>は存在しないが、変換されるようなシーケンスはクォートされていない時に変換される。<br> <syntaxhighlight lang="fish"> echo a\nb # 出力 a b </syntaxhighlight> <br> パラメータ展開や文字エスケープの機能を無視する場合、<code>'</code>または<code>"</code>を使用する。<br> <code>'</code>の間では、Fishは展開を行わない。<br> <code>"</code>の間では、Fishは変数の展開のみを行う。<br> <br> 他の種類の展開(波括弧の展開やパラメータの展開を含む)は行われず、エスケープシーケンス(例. <code>\n</code>)は無視される。<br> 引用符の中では、引数の区切りに空白を使用しないため、引用符で囲まれた引数に空白を含めることができる。<br> <br> <code>'</code>をエスケープする場合は<code>\'</code>、<code>"</code>をエスケープする場合は<code>\"</code>、ドル文字をエスケープする場合は<code>\$</code>、バックスラッシュと改行を削除する場合は<code>\</code>、バックスラッシュ記号をエスケープする場合は<code>\\</code>である。<br> <br> <code>'</code>は<code>"</code>内では特別な意味を持たないが、その逆も同様である。<br> <syntaxhighlight lang="fish"> # "cumbersome filename.txt"という名前のファイルを削除する rm "cumbersome filename.txt" # "cumbersome"ファイルと"filename.txt"ファイルの2つのファイルを削除する rm cumbersome filename.txt # foo.txtファイルの内容から、enabled)で終わる行を検索する # (grepコマンドにおいて、$記号は行末にマッチする) grep 'enabled)$' foo.txt </syntaxhighlight> <br><br> == 文字列の操作 == Fishの文字列の操作は、<code>string</code>コマンド(組み込み関数)により行われる。<br> <br> "bar "を"baz "に置換する。<br> <syntaxhighlight lang="fish"> string replace bar baz "bar luhrmann" # 出力 baz luhrmann </syntaxhighlight> <br> 文字列を分割する。<br> <syntaxhighlight lang="fish"> string split "," "foo,bar" # 出力 foo bar </syntaxhighlight> <br> <code>grep</code>コマンドの代替として、正規表現にマッチする。<br> <syntaxhighlight lang="fish"> echo bababa | string match -r 'aba$' # 出力 aba </syntaxhighlight> <br> 文字列を任意の文字で、指定された幅になるように埋める。<br> <syntaxhighlight lang="fish"> string pad -c x -w 20 "foo" # 出力 xxxxxxxxxxxxxxxxxfoo </syntaxhighlight> <br> 文字列を小文字または大文字にする。<br> <syntaxhighlight lang="fish"> # 小文字に変換する string lower Foo # 出力 foo # 大文字に変換する string upper Foo # 出力 FOO </syntaxhighlight> <br> その他、文字列のリピート、文字列のトリム、文字列のエスケープ、文字列の長さや幅の表示(端末セル単位)を行うこともできる。<br> <br><br> == 特殊な変数 == 下表に、FishとBashの特殊な変数の比較を示す。<br> <center> {| class="wikitable" | style="background-color:#fefefe;" |- ! style="background-color:#66CCFF;" | Bash ! style="background-color:#66CCFF;" | Fish |- | $*<br>$@ || $argv |- | $1<br>$2 || $argv[1]<br>$argv[2] |- | $? || $status |- | $$ || $fish_pid |- | $# || Fishには存在しないため、<br><code>count $argv</code>コマンドを使用する。 |- | $! || $last_pid |- | $0 || Fishには存在しないため、<br><code>status filename</code>コマンドを使用する。 |- | $- || Fishには存在しないため、<br><code>status is-interactive</code>または<code>status is-login</code>を使用する。 |} </center> <br><br> == ヒアドキュメント == Fishは、<code><<EOF</code>文は存在しないため、<code>printf</code>文、または、<code>""</code>と改行を使用して、ヒアドキュメントを行う。<br> <br> <syntaxhighlight lang="fish"> printf %s\n "some string" "some more string" # または echo "some string some more string" # または、引用符を別の行にする場合 echo "\ some string some more string\ " </syntaxhighlight> <br> ヒアドキュメントが行うことを、以下に示す。<br> * 文字列を特殊なルールで終端まで読み取り、解釈する。 * 結果の文字列を一時ファイルに書き出す。 * そのファイルを標準入力として、ヒアドキュメントが添付されているコマンドを起動する。 <br> ヒアドキュメントと同様に、コマンドはstdinから読み込むように準備しなければならない。<br> これには特別なオプションが必要なこともあり、多くの場合、ファイル名を<code>-</code>で与えることにより有効になる。<br> <syntaxhighlight lang="fish"> echo "xterm rxvt-unicode" | sudo zypper remove - # 以下に示すコマンドと同様である # -は、zypperが標準入力から引数を読み込むようにしている sudo zypper remove xterm rxvt-unicode </syntaxhighlight> <br> ヒアドキュメントは、多くの特殊なルールを導入するマイナーな構文上の味付けに過ぎないため、Fishではパイプを使用することにより、簡潔に記述・構成することができる。<br> <br><br> == 算術演算 == Fishでは、算術演算は<code>math</code>コマンドにより処理される。<br> <syntaxhighlight lang="fish"> math $i + 1 </syntaxhighlight> <br> 他のシェルの算術演算と異なり、Fishでは浮動小数点数を扱うことができる。<br> <syntaxhighlight lang="fish"> math 5 / 2 # 出力 2.5 </syntaxhighlight> <br> 三角測量のような機能も存在する。<br> <syntaxhighlight lang="fish"> math cos 2 x pi # 出力 1 </syntaxhighlight> <br> <code>math</code>コマンドの引数は、別々に渡す、または、引用符で囲んで渡すことができる。<br> <u>Fishは、コマンド実行に<code>()</code>を使用するため、式の中で使用する場合は、引用符で囲む必要がある。</u><br> <syntaxhighlight lang="fish"> math '(5 + 2) * 4' </syntaxhighlight> <br> <code>*</code>と</code>x</code>は両方ともFishにおける乗算記号であるが、<code>*</code>を使用する場合は、引用符で囲む必要がある。(グロブに見えるため)<br> <br><br> == プロンプト == Fishは、<code>$PS1</code>や<code>$PS2</code>等の特殊変数は存在しない。<br> <code>fish_prompt</code>関数の出力、または、vi-modeが有効な場合は<code>fish_mode_prompt</code>関数、右プロンプトの場合は<code>fish_right_prompt</code>関数を加えたものが使用できる。<br> <br> * テキストに色を付けるため、<code>set_color</code>を提供している。<br>これは、16色の名前付きカラーやRGBカラー(例. <code>set_color 5555FF</code>)を使用することができる。 * プロンプトに何かを追加するためのヘルパー関数が存在する。 *: 例1. バージョン管理システム(git、mercurial、svn)の表示を追加する<code>fish_vcs_prompt</code>関数 *: 例2. 現在の場所(ユーザのホームディレクトリは<code>~</code>になり、パスの構成要素が全て短縮される)を表示する<code>prompt_pwd</code>関数 *: 例3. ホスト名を短縮して表示する<code>prompt_hostname</code>関数 <syntaxhighlight lang="fish"> function fish_prompt set -l prompt_symbol '$' fish_is_root_user; and set prompt_symbol '#' echo -s (prompt_hostname) \ (set_color blue) (prompt_pwd) \ (set_color yellow) $prompt_symbol (set_color normal) end </syntaxhighlight> <br> デフォルトのプロンプトを確認する場合は、<code>fish_prompt</code>コマンドを実行することにより、表示することができる。<br> <br> Fishは、継続行のための<code>$PS2</code>は存在しない。<br> コマンドラインがまだ完了していないことを示すため、行をインデントしたままにしている。<br> <br><br> == ブロック == FishとBashのブロックの構成を比較する。<br> <syntaxhighlight lang="bash"> # Bash { echo Hello } </syntaxhighlight> <br> <syntaxhighlight lang="fish"> # Fish begin echo Hello end </syntaxhighlight> <br><br> == ビルトインおよびその他のコマンド == Fishは、構文よりもビルトインコマンドや外部コマンドに重点を置いている。<br> 使用頻度の高いビルトインコマンドを、以下に示す。<br> <br> * stringコマンド *: 文字列変換(Bashにおける<code>${i%foo}</code>等)を行うことができる。 *: また、<code>grep</code>コマンドや<code>sed</code>コマンド等の代わりに使用することができる。 *: <br> * mathコマンド *: Bashにおける<code>$((i + 1))</code>の演算を置き換えることができる。 *: また、浮動小数点や簡単な関数(三角関数等)も扱うことができる。 *: <br> * argparseコマンド *: 引数をパースすることができる。 *: これは、Bashにおける<code>getopt</code>コマンド、または、Zshにおける<code>zparseopts</code>コマンドと同様のコマンドである。 *: <br> * countコマンド *: 要素数等を数えることができるため、Bashにおける<code>$#</code>を置き換えることができる。 *: またh、<code>wc</code>コマンドの代わりに使用することができる。 *: <br> * statusコマンド *: Fishの状態に関する情報(例. 対話型かどうか、現在のリネン番号等)を提供する。 *: Bashにおける<code>$-</code>や<code>$BASH_LINENO</code>等の特殊変数を置き換えることができる。 *: <br> * seq(1)コマンド *: Bashにおける<code>{1..10}</code>の範囲拡張の代わりとして使用することができる。 *: また、<code>seq</code>コマンドは別のコマンドに置き換えることができる。 <br><br> __FORCETOC__ [[カテゴリ:シェルスクリプト]]
BashユーザのためのFish
に戻る。
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
ツール
リンク元
関連ページの更新状況
特別ページ
ページ情報
We ask for
Donations
Collapse