「Fish」の版間の差分

提供: ArchWiki
ナビゲーションに移動 検索に移動
(未訳部分の翻訳)
26行目: 26行目:
   
 
=== リダイレクト ===
 
=== リダイレクト ===
  +
リダイレクトという仕組みを使うことでファイル記述子の出力先を他のファイルに変えることができます:
Any file descriptor can be directed to other files through a mechanism called redirection:
 
   
{{bc|''Redirecting standard input:''
+
{{bc|''標準入力をリダイレクト:''
 
$ command < source_file
 
$ command < source_file
   
  +
''標準出力をリダイレクト:''
''Redirecting standard output:''
 
 
$ command > destination
 
$ command > destination
   
  +
''既存のファイルに標準出力を追記:''
''Appending standard output to an existing file:''
 
 
$ command >> destination
 
$ command >> destination
   
  +
''標準エラーをリダイレクト:''
''Redirecting standard error:''
 
 
$ command ^ destination
 
$ command ^ destination
   
  +
''既存のファイルに標準エラーを追記:''
''Appending standard error to an existing file:''
 
 
$ command ^^ destination}}
 
$ command ^^ destination}}
   
  +
{{ic|destination}} には以下のどれかを使えます:
You can use one of the following as {{ic|destination}}:
 
   
  +
* ファイル名 (出力は指定されたファイルに書き込まれます)。
* A filename (the output will be written to the specified file).
 
  +
* {{ic|&}} と他のファイル記述子の番号。出力は他のファイル記述子に書き込まれます。
* An {{ic|&}} followed by the number of another file descriptor. The output will be written to the other file descriptor.
 
* An {{ic|&}} followed by a {{ic|-}} sign. The output will not be written anywhere.
+
* {{ic|&}} {{ic|-}} 記号。出力はどこにも書き込まれません。
   
  +
例:
Examples:
 
  +
{{bc|''標準出力をファイルにリダイレクト:''
{{bc|''Redirecting standard output to a file:''
 
 
$ command > destination_file.txt
 
$ command > destination_file.txt
   
  +
''標準出力と標準出力の両方を同じファイルにリダイレクト:''
''Redirecting both standard output and standard error to the same file:''
 
 
$ command > destination_file.txt ^ &1
 
$ command > destination_file.txt ^ &1
   
  +
''標準出力を消す:''
''Silencing standard output:''
 
 
$ command > &-}}
 
$ command > &-}}
   
 
=== パイプ ===
 
=== パイプ ===
   
  +
あるコマンドの標準出力を次のコマンドの標準入力にリダイレクトすることができます。パイプ文字 ({{ic|<nowiki>|</nowiki>}}) を使ってコマンドを区切って下さい。例:
You can redirect standard output of one command to standard input of the next command. This is done by separating the commands by the pipe character ({{ic|<nowiki>|</nowiki>}}). Example:
 
   
 
cat example.txt | head
 
cat example.txt | head
   
  +
(標準出力だけでなく) 他のファイル記述子をパイプにリダイレクトすることもできます。次の例では、標準エラーのファイル記述子の番号と {{ic|>}} をパイプに付けることで、あるコマンドの標準エラーを他のコマンドの標準入力に流し込んでいます:
You can redirect other file descriptors to the pipe (besides standard output). The next example shows how to use standard error of one command as standard input of another command, prepending standard error file descriptor's number and {{ic|>}} to the pipe:
 
   
 
$ command 2>| less
 
$ command 2>| less
   
This will run {{ic|command}} and redirect its standard error to the {{ic|less}} command.
+
上記を実行すると {{ic|command}} が実行されてから標準エラーが {{ic|less}} コマンドにリダイレクトされます。
   
 
== 設定 ==
 
== 設定 ==
84行目: 84行目:
 
=== プロンプト ===
 
=== プロンプト ===
   
  +
git ディレクトリにいるときにブランチやダーティな状態を fish に表示してほしい場合、以下を {{ic|~/.config/fish/config.fish}} に追加します:
If you would like fish to display the branch and dirty status when you are in a git directory, you can add the following to your {{ic|~/.config/fish/config.fish}}:
 
 
{{bc|<nowiki>
 
{{bc|<nowiki>
 
# fish git prompt
 
# fish git prompt
121行目: 121行目:
 
=== /etc/profile と ~/.profile の互換性 ===
 
=== /etc/profile と ~/.profile の互換性 ===
   
Since standard POSIX {{ic|sh}} syntax is not compatible with fish, fish will not be able to source {{ic|/etc/profile}} (and thus all {{ic|*.sh}} in {{ic|/etc/profile.d}}) and {{ic|~/.profile}}
+
POSIX 標準の {{ic|sh}} の構文は fish と互換性がないため、fish では {{ic|/etc/profile}} (そして {{ic|/etc/profile.d}} {{ic|*.sh}} ファイル) {{ic|~/.profile}} を source することはできません。
   
If you want fish to source those files, install {{Pkg|dash}} and add this line to your {{ic|config.fish}}:
+
これらのファイルを fish source したい場合、[[dash]] をインストールして以下の行を {{ic|config.fish}} に追加してください:
 
env -i HOME=$HOME dash -l -c printenv | sed -e '/PATH/s/:/ /g;s/=/ /;s/^/set -x /' | source
 
env -i HOME=$HOME dash -l -c printenv | sed -e '/PATH/s/:/ /g;s/=/ /;s/^/set -x /' | source
   
  +
組み込まれているコマンドを使うことで実行ファイルの呼び出しを省くこともできます:
an alternative variant will save you one executable invocation by using a builtin command:
 
 
env -i HOME=$HOME dash -l -c 'export -p' | sed -e "/PATH/s/'//g;/PATH/s/:/ /g;s/=/ /;s/^export/set -x/" | source
 
env -i HOME=$HOME dash -l -c 'export -p' | sed -e "/PATH/s/'//g;/PATH/s/:/ /g;s/=/ /;s/^export/set -x/" | source
   
 
==Tips and Tricks==
 
==Tips and Tricks==
===History Substitution===
+
===履歴置換===
Fish does not implement history substitution (e.g. {{ic|sudo !!}}), and the fish developers have said that they [http://fishshell.com/docs/current/faq.html#faq-history do not plan to]. Still, this is an essential piece of many users' workflow. Reddit user, [http://www.reddit.com/u/crossroads1112 crossroads1112], created a function that regains some of the functionality of history substitution and with another syntax. The function is on [https://gist.github.com/crossroads1112/77badb2c3455e23b873b github] and instructions are included as comments in it. There is a [https://gist.github.com/b-/981892a65837ab0a387e forked version] that is closer to the original syntax and allows for {{ic|command !!}} if you specify the command in the helper function.
+
Fish は履歴置換 (例: {{ic|sudo !!}}) を実装しておらず、fish の開発者は [http://fishshell.com/docs/current/faq.html#faq-history 実装する予定もない] と発言しています。しかしながら、履歴置換は多くのユーザーにとって必要不可欠な機能です。Reddit ユーザーの [http://www.reddit.com/u/crossroads1112 crossroads1112] が履歴置換の機能を再現した関数を作成しています (ただし構文は異なっています)。関数は [https://gist.github.com/crossroads1112/77badb2c3455e23b873b github] にあり、使い方はコメントとして書いてあります。オリジナルの構文に近づけた [https://gist.github.com/b-/981892a65837ab0a387e フォークバージョン] も存在し、ヘルパー関数でコマンドを指定すれば {{ic|command !!}} が使えます。
   
 
== トラブルシューティング ==
 
== トラブルシューティング ==
   
  +
Arch では、シェルスクリプトの多くは Bash 向けに書かれており、fish に翻訳されていません。そのため、fish をデフォルトシェルに設定しないほうが得策です。fish を実行するコマンドラインオプションを指定してターミナルエミュレータを開くのが一番良いと思われます。ほとんどのターミナルでは {{ic|-e}} スイッチを使います。例えば、fish で gnome-terminal を開きたいときは、使用するショートカットを以下のように変更してください:
In Arch, there are a lot of shell scripts written for Bash, and these have not been translated to fish. It is advisable not to set fish as your default shell because of this. The best option is to open your terminal emulator with a command line option that executes fish. For most terminals this is the {{ic|-e}} switch, so for example, to open gnome-terminal using fish, change your shortcut to use:
 
   
 
gnome-terminal -e fish
 
gnome-terminal -e fish
   
  +
LilyTerm などシェルの設定をサポートしていない軽量なターミナルエミュレータでは以下のようにします:
With LilyTerm and other light terminal emulators that do not support setting the shell it would look like this:
 
   
 
SHELL=/usr/bin/fish lilyterm
 
SHELL=/usr/bin/fish lilyterm
   
  +
ターミナルの設定や (ターミナルエミュレータにプロファイル機能がある場合) ターミナルのプロファイルに、ターミナルのデフォルトシェルとして fish を設定する方法もあります。ユーザーのデフォルトシェルを変更することで上記の問題が発生するのとは対照的な設定方法です。
Another option is to set fish as the default shell for the terminal in the terminal's configuration or for a terminal profile if your terminal emulator has a profiles feature. This is contrast to changing the default shell for the user which would cause the above mentioned problem.
 
   
To set fish as the shell started in tmux, put this into your {{ic|~/.tmux.conf}}:
+
tmux で起動するシェルとして fish を設定するには、{{ic|~/.tmux.conf}} に以下を記述:
   
 
set-option -g default-shell "/usr/bin/fish"
 
set-option -g default-shell "/usr/bin/fish"
   
  +
システム全体のデフォルトシェルとして fish を設定しないことで、起動時に arch スクリプトを動作させることができ、環境変数は正しく設定され、その他、fish などの Bash と互換性がないターミナルを使用することによる問題を少なくすることが可能です。
Not setting fish as system wide default allows the arch scripts to run on startup, ensure the environment variables are set correctly, and generally reduces the issues associated with using a non-Bash compatible terminal like fish.
 
   
  +
fish をデフォルトシェルとして設定した場合、パスが正しく設定されていないことに気づくでしょう。{{ic|~/.config/fish/config.fish}} にセクションを追加してログイン時にパスを適切に設定することができます。ログインシェルの場合だけ実行される {{ic|.profile}} や {{ic|.bash_profile}} と同じです。
If you decide to set fish as your default shell, you may find that you no longer have very much in your path.
 
You can add a section to your {{ic|~/.config/fish/config.fish}} file that will set your path correctly on login. This is much like {{ic|.profile}} or {{ic|.bash_profile}} as it is only executed for login shells.
 
   
 
{{bc|
 
{{bc|
160行目: 159行目:
 
}}
 
}}
   
  +
{{ic|$MOZ_PLUGIN_PATH}} など、他の環境変数も手動で追加する必要があります。fish をデフォルトシェルとしてシームレスに使えるようにするには骨が折れる作業量になります。
Note that you will need to manually add various other environment variables, such as {{ic|$MOZ_PLUGIN_PATH}}. It is a huge amount of work to get a seamless experience with fish as your default shell.
 
   
 
=== su で bash が起動する ===
 
=== su で bash が起動する ===

2016年1月1日 (金) 19:30時点における版

fish (friendly interactive shell) は主に対話的に使用することを意図されたユーザフレンドリーなコマンドラインシェルです。

インストール

公式リポジトリより、主流フォーク の安定版 fish パッケージをインストールできます。

最新の開発版は AUR より fish-shell-gitAUR[リンク切れ: アーカイブ: aur-mirror]インストールします。

2011年に オリジナルの開発者 による 開発が中止された 従来のバージョンは AUR より fish-gitAURインストールします。

fish をデフォルトシェルにするには、chsh -s /usr/bin/fish を実行します。

入出力

ファイル記述子

他のシェルと同じように、入出力ストリームをリダイレクトすることが fish でも出来ます。テキストファイルを使ってプログラムのエラー出力を保存したり、テキストファイルを入力したりする場合に有用です。ほとんどのプログラムは3つの入出力ストリームを使います。ファイル記述子 (FD) と呼ばれる番号で表されます:

  • 標準入力 (FD 0) は読み取りに使われます (デフォルトではキーボード)。
  • 標準出力 (FD 1) は書き込みに使われます (デフォルトではスクリーン)。
  • 標準エラー (FD 2) はエラーや警告の表示に使われます (デフォルトではスクリーン)。

リダイレクト

リダイレクトという仕組みを使うことでファイル記述子の出力先を他のファイルに変えることができます:

標準入力をリダイレクト:
$ command < source_file

標準出力をリダイレクト:
$ command > destination

既存のファイルに標準出力を追記:
$ command >> destination

標準エラーをリダイレクト:
$ command ^ destination

既存のファイルに標準エラーを追記:
$ command ^^ destination

destination には以下のどれかを使えます:

  • ファイル名 (出力は指定されたファイルに書き込まれます)。
  • & と他のファイル記述子の番号。出力は他のファイル記述子に書き込まれます。
  • &- 記号。出力はどこにも書き込まれません。

例:

標準出力をファイルにリダイレクト:
$ command > destination_file.txt

標準出力と標準出力の両方を同じファイルにリダイレクト:
$ command > destination_file.txt ^ &1

標準出力を消す:
$ command > &-

パイプ

あるコマンドの標準出力を次のコマンドの標準入力にリダイレクトすることができます。パイプ文字 (|) を使ってコマンドを区切って下さい。例:

cat example.txt | head

(標準出力だけでなく) 他のファイル記述子をパイプにリダイレクトすることもできます。次の例では、標準エラーのファイル記述子の番号と > をパイプに付けることで、あるコマンドの標準エラーを他のコマンドの標準入力に流し込んでいます:

$ command 2>| less

上記を実行すると command が実行されてから標準エラーが less コマンドにリダイレクトされます。

設定

fish のユーザー設定ファイルは ~/.config/fish/config.fish に存在しています。.bashrc と同じように、ターミナルが開かれる時に実行/定義するコマンド、関数を追加します。

ウェブインターフェイス

fish のプロンプトとターミナルの色はウェブインターフェイスで対話的に設定できます:

fish_config

選択した設定は、個人用の設定ファイルに書き込まれます。また、定義された関数と履歴を表示することができます。

プロンプト

git ディレクトリにいるときにブランチやダーティな状態を fish に表示してほしい場合、以下を ~/.config/fish/config.fish に追加します:

# fish git prompt
set __fish_git_prompt_showdirtystate 'yes'
set __fish_git_prompt_showstashstate 'yes'
set __fish_git_prompt_showupstream 'yes'
set __fish_git_prompt_color_branch yellow

# Status Chars
set __fish_git_prompt_char_dirtystate '⚡'
set __fish_git_prompt_char_stagedstate '→'
set __fish_git_prompt_char_stashstate '↩'
set __fish_git_prompt_char_upstream_ahead '↑'
set __fish_git_prompt_char_upstream_behind '↓'
 
function fish_prompt
        set last_status $status
        set_color $fish_color_cwd
        printf '%s' (prompt_pwd)
        set_color normal
        printf '%s ' (__fish_git_prompt)
       set_color normal
end

コマンド補完

fish は man ページから自動補完を生成できます。~/.config/fish/generated_completions/ に補完が書き込まれており、以下を呼び出すことによって生成することができます:

fish_update_completions

また、独自の補完を ~/.config/fish/completions/ に定義できます。/usr/share/fish/completions/ でいくつかの例を見ることができます。

fish の開発元のポリシーが、上流の tarball に存在する補完を全て含めるというものなので pacman, pacman-key, makepkg, cower, pbget, pacmatic などの Arch Linux 固有のコマンドの文脈に沿った補完も fish に含まれています。メモリ管理が賢いために、リソースに悪影響を与えることはありません。

/etc/profile と ~/.profile の互換性

POSIX 標準の sh の構文は fish と互換性がないため、fish では /etc/profile (そして /etc/profile.d*.sh ファイル) や ~/.profile を source することはできません。

これらのファイルを fish で source したい場合、dash をインストールして以下の行を config.fish に追加してください:

env -i HOME=$HOME dash -l -c printenv | sed -e '/PATH/s/:/ /g;s/=/ /;s/^/set -x /' | source

組み込まれているコマンドを使うことで実行ファイルの呼び出しを省くこともできます:

env -i HOME=$HOME dash -l -c 'export -p' | sed -e "/PATH/s/'//g;/PATH/s/:/ /g;s/=/ /;s/^export/set -x/" | source

Tips and Tricks

履歴置換

Fish は履歴置換 (例: sudo !!) を実装しておらず、fish の開発者は 実装する予定もない と発言しています。しかしながら、履歴置換は多くのユーザーにとって必要不可欠な機能です。Reddit ユーザーの crossroads1112 が履歴置換の機能を再現した関数を作成しています (ただし構文は異なっています)。関数は github にあり、使い方はコメントとして書いてあります。オリジナルの構文に近づけた フォークバージョン も存在し、ヘルパー関数でコマンドを指定すれば command !! が使えます。

トラブルシューティング

Arch では、シェルスクリプトの多くは Bash 向けに書かれており、fish に翻訳されていません。そのため、fish をデフォルトシェルに設定しないほうが得策です。fish を実行するコマンドラインオプションを指定してターミナルエミュレータを開くのが一番良いと思われます。ほとんどのターミナルでは -e スイッチを使います。例えば、fish で gnome-terminal を開きたいときは、使用するショートカットを以下のように変更してください:

gnome-terminal -e fish

LilyTerm などシェルの設定をサポートしていない軽量なターミナルエミュレータでは以下のようにします:

SHELL=/usr/bin/fish lilyterm

ターミナルの設定や (ターミナルエミュレータにプロファイル機能がある場合) ターミナルのプロファイルに、ターミナルのデフォルトシェルとして fish を設定する方法もあります。ユーザーのデフォルトシェルを変更することで上記の問題が発生するのとは対照的な設定方法です。

tmux で起動するシェルとして fish を設定するには、~/.tmux.conf に以下を記述:

set-option -g default-shell "/usr/bin/fish"

システム全体のデフォルトシェルとして fish を設定しないことで、起動時に arch スクリプトを動作させることができ、環境変数は正しく設定され、その他、fish などの Bash と互換性がないターミナルを使用することによる問題を少なくすることが可能です。

fish をデフォルトシェルとして設定した場合、パスが正しく設定されていないことに気づくでしょう。~/.config/fish/config.fish にセクションを追加してログイン時にパスを適切に設定することができます。ログインシェルの場合だけ実行される .profile.bash_profile と同じです。

if status --is-login
        set PATH $PATH /usr/bin /sbin
end

$MOZ_PLUGIN_PATH など、他の環境変数も手動で追加する必要があります。fish をデフォルトシェルとしてシームレスに使えるようにするには骨が折れる作業量になります。

su で bash が起動する

su で bash が起動する場合 (Bash がデフォルトシェルのため)、fish に関数を定義してください:

$ funced su
function su
        /bin/su --shell=/usr/bin/fish $argv
end
$ funcsave su

ログイン時に X を起動

~/.config/fish/config.fish の一番下に以下を追加します:

# start X at login
if status --is-login
    if test -z "$DISPLAY" -a $XDG_VTNR -eq 1
        exec startx -- -keeptty
    end
end
ノート: fish 使用時に startx-keeptty フラグを必要とする理由については この記事 を参照してください。

参照