[]形式を使用して短縮する方法

[]形式を使用して短縮する方法

一行に減らしたいです。

if ls --version 2>/dev/null | grep -q 'coreutils'; then alias ls='ls --color=always'
else alias ls='ls -G'
fi

たとえば、私はしばしば[]条件文を使用し[ -z(or -n) condition]ますが、この形式で別の部分を実行したことはありません。

Rubyではこれを行います。condition ? true : false Bashにも同等のものはありますか?

頑張った

[ -z ls --version 2>/dev/null | grep -q 'coreutils'] ? alias ls='ls --color=always' : alias ls='ls -G'

しかし、明らかにこれは正しいアプローチではありません。

私はすべてを.bashrc小さなウィンドウ(<〜50行)に合わせたいので、1行が必要です。したがって、他の複数行の行と同様に、できるだけ1行に圧縮します。この例では、サイズが大きいため、読みやすさを犠牲にする意図があります。

私も次のことを試しました。

[ -z ls --version 2>/dev/null | grep -q 'coreutils'] && alias ls='ls --color=always' || alias ls='ls -G'

そして

[ -n ls --version 2>/dev/null | grep -q 'coreutils'] && alias ls='ls --color=always' || alias ls='ls -G'

そして

[ ls --version 2>/dev/null | grep -q 'coreutils'] && alias ls='ls --color=always' || alias ls='ls -G'

しかし、私はいつも「then」エイリアスの代わりに「else」エイリアスを取得します。

元に戻すことはできますが、うまく機能しないので役に立つかどうか疑問です。唯一の確実な方法は、OSXで試してみることです。私は今Ubuntuを使用しています。

答え1

長すぎる博士。

使用

ls --color=always > /dev/null 2>&1 && alias ls='ls --color=always' || alias ls='ls -G'`

詳細...
[...]条件式のみを評価する必要があります(ファイル統計、文字列比較、数値比較、参照CONDITIONAL EXPRESSIONSbash(1)。彼らはまた建設に必要ですif ... ; then ...; else

比較的単純な構造の場合

if CONDITION; then
    EXPR1
else
    EXPR2
fi

に取り替えることができる

CONDITION && EXPR1 || EXPR2

最初の場合に必要でない限り、[...]2番目の場合には必要ありません。

あなたの場合、CONDITIONこれはls --version 2>/dev/null | grep -q 'coreutils'戻りコードですgrep。だからあなたは書くことができます

ls --version 2>/dev/null | grep -q 'coreutils' && alias ls='ls --color=always' || alias ls='ls -G'

ls注:サポートされていることを直接確認する方が簡単です--color

ls --color=always > /dev/null 2>&1 && alias ls='ls --color=always' || alias ls='ls -G'

答え2

を使用すると、zsh次のように圧縮できます。

if {ls --version|&grep -q coreutils} {alias ls='ls --color=always'
} else {alias ls='ls -G'}

if/then/else の代替構成はcmd1 && cmd2 || cmd3単に同じではないため、通常は避けてください。

存在する

cmd1 && cmd2 || cmd3`

cmd2cmd1返されたら実行しますtrue。次のいずれかのcmd3条件が満たされた場合cmd1 またはcmd2偽を返します。

あなたの場合cmd2()がfalseを返す可能性はほとんどありませんが、alias一般的な場合は問題を忘れやすいので、最初からその設定を避けるのが最善です。

ただ本物これが役に立つ理由は、構文が異なる構文を持つrcBourneおよびcsh様シェル(または同様のシェル)で動作するコードを記述したい場合です。if/then/else

関連情報