bashとfishの違い

はじめに

fishを使い始めて戸惑った所をまとめてみた.

コマンド実行はバッククォートではなく括弧

bashはバッククォート,fishは括弧.

bash

$ echo `date`

fish

$ echo (date)

findの-execオプションに渡す引数は要エスケープ

bashは{},fishは\{\}(エスケープが必要).

bash

$ find . -name "*.html" -exec grep -H "foo" {} \;

fish

$ find . -name "*.html" -exec grep -H "foo" \{\} \;

aliasはfunction

bash

alias java='/c/openjdk-12.0.1/bin/java.exe -Dfile.encoding=UTF-8'

fish(引数$argvの記載を忘れずに)

function java
    /c/openjdk-12.0.1/bin/java.exe -Dfile.encoding=UTF-8 $argv
end

functionで環境変数を使う時は要eval

bash

alias java='$JAVA_HOME/bin/java.exe -Dfile.encoding=UTF-8'

fish

function java
    eval $JAVA_HOME/bin/java.exe -Dfile.encoding=UTF-8 $argv
end

evalを付けずに環境変数を使うとエラーになる.エラーメッセージの中にヒントが書いてある.

evalを付けずにfunctionを定義.

function java
    $JAVA_HOME/bin/java.exe -Dfile.encoding=UTF-8 $argv
end

実行すると,「evalを使ってね」とエラーメッセージが出る.

$ java -version
~/.config/fish/config.fish (line 1): Variables may not be used as commands. In fish, please define a function or use 'eval $JAVA_HOME/bin/java.exe'.
in function 'java'
      called on standard input
      with parameter list '-version'

コマンド実行を使う時もevalが必要.

function java
    eval (cygpath -u /c/openjdk-12.0.1/)/bin/java.exe -Dfile.encoding=UTF-8 $argv
end

環境変数とコマンド実行両方使ってもevalが必要.

function java
    eval (cygpath -u $JAVA_HOME)/bin/java.exe -Dfile.encoding=UTF-8 $argv
end

環境

  • Windows 10 Pro
  • cygwin 3.0.7
  • bash 4.4.12
  • fish 2.7.0