よくある質問
環境変数の追加, 削除をするには?
[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
のように使います;
複数の変数を確認するには'and
やor
の演算子を使ってください.
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(ユニバーサル変数のエクスポート)が働かない?
既に同じ名前のグローバル変数が設定されています.
EDITOR
やTZ
といった環境変数は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+D
やAlt+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プロジェクトとして上記のリポジトリのメリットや含まれるスクリプトについて何か意見するわけではありません.