よくある質問

環境変数の追加, 削除をするには?

[set]コマンドを使ってください.

set -x key value
set -e key

ログイン時にコマンドを実行するには? fishの.bashrcは?

~/.config/fish/config.fishを編集してください. もし存在しなければ作成することもできます.

独自のプロンプトを設定するには?

プロンプトはfish_prompt関数の出力になります. この関数は~/.config/fish/functions/fish_prompt.fishに配置してください. 簡単な例を下に示します.

function fish_prompt
    set_color $fish_color_cwd
    echo -n (prompt_pwd)
    set_color normal
    echo -n ' > '
end

Web上の設定ツール, [fish_config]を使うこともできます. プロンプトのサンプルから選んで試すことができます.

履歴からコマンドを実行するには?

コマンドの一部を入力し, それから(up)或いは(down)を押してください. マッチした履歴を選択することができます.

サブコマンドを実行するには? バッククオートが動作しません!

fishはサブコマンドを実行するために()を使います.

for i in (ls)
    echo $i
end

pkg-configのような出力が1行の長い文字列のときどうしたらいい?

他のシェルと違って, fishは改行時のみ置換されたコマンドを分割します. スペースやタブ, $IFSに含まれる文字では分割されません.

これは次のことを意味します.

echo x(printf '%s ' a b c)x

を実行するとxa b c xが出力されます. しかし次の場合,

echo x(printf '%s\n' a b c)x

xax xbx xcxが出力されます.

ほぼ全てのケースにおいてスペース区切りは望ましくないので, この仕様は改善点であるといえます.

しかしながら, pkg-configやその周辺ツールなどではスペース区切りが必要となっています. このような場合, string split " "を使ってください.

g++ example_01.cpp (pkg-config --cflags --libs gtk+-2.0 | string split " ")

コマンドの終了ステータスを得るには?

$status変数を使ってください. これは他のシェルで使われている$?変数を置き換えるものです.

somecommand
if test $status -eq 7
    echo "That's my lucky number!"
end

もし単に成功か失敗かを知りたいだけなら, ifのような条件構文に直接渡してください.

if somecommand
    echo "Command succeeded"
else
    echo "Command failed"
end

より詳しくは[test]コマンドや[if]コマンドを参照してください.

一回限りの環境変数を設定するには?

SOME_VAR=1 commandというコマンドは次のエラーを引き起こします. Unknown command "SOME_VAR=1"

このようなときにはenvコマンドを使ってください.

env SOME_VAR=1 command

ブロック中で次のようにローカル変数を宣言することもできます.

begin
    set -lx SOME_VAR 1
    command
end

変数が定義されるているか確認するには?

set -q varコマンドを使ってください.

例えばif set -q --$var; echo variable defined; endのように使います;

複数の変数を確認するには'andorの演算子を使ってください.

if set -q var1; or set -q var2
    echo either variable defined
end

定義済みの変数は空である可能性もあることに注意してください. 次の2つのコマンドで空の変数を定義できます. set var set var ""

変数が空でないか確認するには?

string length -q -- $varを使ってください. 例えばif string length -q -- $var; echo not empty; endのように使います.

string lengthは複数の引数のリストを個別にチェックし, 1つでも空でなければ0を返します.

if string length -q -- $var1 $var2 $var3
    echo at least one of these variables is not empty
end

代わりにtest -n "$var"を使ってください. ただしダブルクオートで変数を括ることを忘れないでください. 例えばif test -n "$var"; echo not empty; endのように使います. testコマンドはオプションとして-a(and)と-o(or)を持ちます.

if test -n "$var1" -o -n "$var2" -o -n "$var3"
    echo at least one of these variables is not empty
end

set -Ux(ユニバーサル変数のエクスポート)が働かない?

既に同じ名前のグローバル変数が設定されています.

EDITORTZといった環境変数はset -Uxによってユニバーサルに設定できます. しかし, fishが起動する前に既に環境変数が設定されている場合(ログインスクリプトやシステムの管理者によって), それはグローバル変数として設定されます. [変数スコープ]は"inside out"の検索方式をとっていて, ローカル変数, グローバル変数それからユニバーサル変数の順に変数を確認していきます.

これはグローバル変数の方がユニバーサール変数よりも優先順位が高いことを意味しています.

この問題を避けるために, fishの継承の設定を変えることが考えられます. これが不可能なら, 次のような設定を[設定ファイル] (大抵の場合, ~/.config/fish/config.fish)に記述してください.

set -gx EDITOR vim

シンタックスハイライトの色を変えるには?

ウェブの設定ツールの[fish_config], 若しくは環境変数の[fish_color]を変更してください.

manページの補完をアップデートするには?

[fish_update_completions]コマンドを使ってください.

間違ってディレクトリのパスを打ってEnter押したらディレクトリが移動してしまいました. 何が起きたの?

fishは与えられたコマンドが存在しなくて, かつ./, ~から始まる場合, その名前のディレクトリが存在しないか確認します. 存在すればディレクトリを移動したいのだと暗黙的に推定して実行します. 例えばホームディレクトリに移動する最速の方法は単に~と打ってEnterを押すだけです.

オープンコマンドが働きません

openコマンドはMIMEデータベースとGnomeやKDEが用いるファイルタイプによってデフォルトの動作を規定する, .desktopファイルを用います. これらの環境が少なくとも1つでも存在するにも関わらずopenコマンドが動作しない場合, これらに関係するファイルが標準的な場所にインストールされていないかもしれません. [困ったときには]も参照ください.

fishをデフォルトシェルにするには?

パッケージマネージャを使わずにコンパイルしてfishをインストールした場合, まず以下のコマンドによってfishをシェルのリストに追加する必要があります. (ただし, fishが/usr/localにインストールされていると仮定します.)

echo /usr/local/bin/fish | sudo tee -a /etc/shells

パッケージマネージャを使ってインストールした場合は既にこの操作は行われています.

デフォルトシェルにするには次のコマンドを打ってください.

chsh -s /usr/local/bin/fish

上記のパスは/usr/bin/fishのように変更する必要があるかもしれません. fishがどこにインストールされているかわからない場合はwhich fishコマンドで確認してください.

残念なことに変更をすぐに反映することはできないので, 一度ログアウトしてから再ログインしてください.

screenを使ってるとき, プロンプトの前に変な出力がでます

手っ取り早い解決策はこちらです.

次のコマンドをfish上で実行してください.

function fish_title; end; funcsave fish_title

これで解決するはずです.

さらに何が起こっているか説明します.

fishはターミナルにタイトルバーメッセージを設定します. screenがこの機能をサポートしており, ターミナルがサポートしていない場合, screenはエスケープコードを出力しターミナルはそれを無視することなくテキストとして表示してしまいます. fishはターミナルの種類がなんであるか判別する方法を持たないので, fish側からこの問題を解決することはできません. したがって, 上記のようにタイトルバーメッセージを空にするしか方法がありません.

fishはデフォルトのタイトルバーメッセージを持っていて, それはfish_title関数が未定義のときに使われることに注意してください. そのため単純にfish_title関数を削除してもうまくいきません.

グリーティングメッセージを変更するには?

fish_greeting変数の値を変更するか, 或いはfish_greeting関数を作成してください. 例えばグリーティングをなくすには次のようにします.

set fish_greeting

履歴置換(!$など)が働かないのはなぜ?

履歴置換は対話形式の編集が可能になる前に開発された行儀の悪いインターフェースであるからです. fishはこのインターフェースを無くし, 代わりに完全な対話形式の履歴想起インターフェースを持ちます. これまでの習慣を少し変える必要があります. 古い行や単語を修正したいときにはまずそれを思い出してそれから編集してください. 例えばsudo !!とは打たないでください. まずUpキーを押してそれからHome, 最後にsudoと打ってください.

fishの履歴想起は以下のようにとてもシンプルかつ効率的です.

  • 他のモダンなシェル同様, は最後に実行した行から順に行全体を呼び出します. 一回押すと!!を置き換え, !-3などを置き換えたい場合には次のようにしてください.

    • ずっと前の履歴を呼び出したいとき, そのコマンドの一部を打ってからを一回或いは複数回押してください. こうすることでその文字列を含んだコマンドに絞って呼び出すことができ, 必要な行をより早く手に入れることができます. これは!vi!?bar.cなどの代わりになります.
  • Alt+↑, Upは直近に実行した行から順番に引数のみを呼び出します. 一回押すと!$を置き換え, !!:4などを置き換えたい場合は次のようにしてください.

    • 使いたい引数が履歴のずっと前にある場合, 引数の一部を打ってからAlt+↑, Upを押してください. こうすることでその文字列を含んだ引数に絞って呼び出すことができ, 必要な行をより早く手に入れることができます. 試してみるととても便利なことがわかるでしょう.
    • 同一の行から複数の引数を再利用したい場合(!!:3*のように), 全体を呼び出した後必要ない部分を削除するといいでしょう. (Alt+DAlt+Backspaceを用いると手早く済みます.)

fishでの行の編集について, 詳細は[ドキュメント]を参照してください.

-cd -のショートカットとして使うには?

2.5.0より前のfishではcd -という動作をする-関数を定義することが可能でした. いくつかのバグフィクスを含んだ2.5.0のリリースによって単なる-は無効な関数(変数も同様)となりました. しかしアブリビエーションを使うことによって同様の操作を行うことができます.

abbr -a -- - 'cd -'

アンインストールするには?

万が一fishをアンインストールしたくなった場合, まずデフォルトシェルに設定されていないことを確認してください. もしそうであればchsh -s /bin/bashで変更してください.

次に以下の操作をしてください. (/usr/localにfishがインストールされていると想定しています.)

rm -Rf /usr/local/etc/fish /usr/local/share/fish ~/.config/fish
rm /usr/local/share/man/man1/fish*.1
cd /usr/local/bin
rm -f fish fish_indent

fishのUnicode private-use charactersについて

fishはU+F600からU+F73Fの Unicode private-use character を内部的に使用しています. この範囲の文字を使用した場合, Unicodeの'replacement character', U+FFFDに変換されます. これにはインタラクティブな入力とファイルによる入力が含まれます. (ただし実行されるプログラムには関係しません.)

fishの拡張機能を探すには?

fishのユーザーコミュニティがfishにバンドルされるほど汎用的ではないが便利で素晴らしいスクリプトを公開しています. プロンプトやテーマ, 便利な関数を含む, こうした拡張機能をいくつかのサードパーティのリポジトリから手に入れることができます.

これは全てのリポジトリを網羅したものではなく, fishプロジェクトとして上記のリポジトリのメリットや含まれるスクリプトについて何か意見するわけではありません.