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