.png)
環境変数のパターンマッチに応じてエイリアスを1行で設定したい。
やっています:
[[$HOSTNAME =~ 'q20' ]] && alias a='cd ~/a1' || alias a='cd ~/a99'
でも私は-bash: [[uscamwebq20.boston.zipcar.com: command not found
私も試しました:
$ [ -z $HOSTNAME =~ q20 ] && alias a='cd ~/a1' || alias a1='cd ~/a99'
でも私は-bash: [: too many arguments
答え1
case $HOSTNAME in (*q20*) alias a='cd ~/a1';; (*) alias a='cd ~/a99'; esac
エラーが発生するのは、 と の後にスペースがないためです。これは、 が特定の文字列が空かどうかをテストするため[[
のものであるためです。は非標準の機能であるため、その動作は のバージョンによって異なります。構造は POSIX であり、記述どおりに は任意の POSIX シェルおよび の任意のバージョンで動作します。-z
[[
bash
case
bash
cmd1 && cmd2 || cmd3
より一般的には、失敗した場合は通常、期待どおりに動作しないため、次のようなものは避けたほうがよいでしょうcmd2
。
また、すべてを 1 行にまとめる意味がわかりません。これは rc ファイルに格納されるものですよね? 複数行にまとめると、はるかに読みやすくなります。
case $HOSTNAME in
(*q20*) alias a='cd ~/a1';;
(*) alias a='cd ~/a99'
esac
以下よりも読みやすく、持ち運びやすいです。
if [[ $HOSTNAME =~ q20 ]]; then
alias a='cd ~/a1'
else
alias a='cd ~/a99'
fi
それ自体は、以下よりも読みやすく(そしてより正確です)。
[[ $HOSTNAME =~ q20 ]] &&
alias a='cd ~/a1' ||
alias a='cd ~/a99'
それ自体がより読みやすい
[[ $HOSTNAME =~ q20 ]] && alias a='cd ~/a1' || alias a='cd ~/a99'
答え2
最初の形式を使用することもできますが、 の後に空白を入れる必要があります[[
。参照:
$ type [[
[[ is a shell keyword
$ help [[
[[ ... ]]: [[ expression ]]
Execute conditional command.
したがって、コマンドは次のようになります。
[[ $HOSTNAME =~ 'q20' ]] && alias a='cd ~/a1' || alias a='cd ~/a99'