これをワンライナーに短縮したいと思います。
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]
この形式で else 部分を実行する必要はまだありません。
Ruby では次のようにします。bashcondition ? true : false
に同等のものはありますか?
私は試した
[ -z ls --version 2>/dev/null | grep -q 'coreutils'] ? alias ls='ls --color=always' : alias ls='ls -G'
しかし、明らかにそれは正しいやり方ではありません。
すべてを.bashrc
小さめのウィンドウ (< ~50 行) に収めたいので、ワンライナーにしたいので、他のマルチライナーと同様に、可能な場合は 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 EXPRESSIONS
bash(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`
cmd2
cmd1
が返された場合に実行されますtrue
。また、cmd3
次のいずれかの場合に実行されます。cmd1
またはcmd2
false を返します。
あなたの場合、cmd2
( alias
) が false を返す可能性は非常に低いですが、一般的なケースでは問題を忘れやすいので、そもそもその構造を避けるのが最善です。
唯一の本物これが役に立つ理由は、構文が異なるBourne のようなシェルと csh のようなシェル (または、rc
同様に機能する -like シェル)の両方で動作するコードを記述する場合です。if/then/else