Ich möchte es auf einen Einzeiler verkürzen:
if ls --version 2>/dev/null | grep -q 'coreutils'; then alias ls='ls --color=always'
else alias ls='ls -G'
fi
Ich verwende es häufig []
für Bedingungen, z. B., [ -z(or -n) condition]
musste in diesem Format aber bisher noch keinen „else“-Teil erstellen.
In Ruby würde ich Folgendes tun: condition ? true : false
Gibt es ein Äquivalent in Bash?
Ich habe es versucht
[ -z ls --version 2>/dev/null | grep -q 'coreutils'] ? alias ls='ls --color=always' : alias ls='ls -G'
aber das ist offensichtlich nicht der richtige Weg.
Ich möchte einen Einzeiler, weil ich möchte, dass alles .bashrc
in ein eher kleines Fenster (< ~50 Zeilen) passt. Wie bei anderen Mehrzeilern komprimiere ich sie daher, wenn möglich, zu Einzeilern. Für dieses Beispiel bin ich bereit, die Lesbarkeit zugunsten der Größe zu opfern.
Ich habe auch versucht:
[ -z ls --version 2>/dev/null | grep -q 'coreutils'] && alias ls='ls --color=always' || alias ls='ls -G'
Und
[ -n ls --version 2>/dev/null | grep -q 'coreutils'] && alias ls='ls --color=always' || alias ls='ls -G'
Und
[ ls --version 2>/dev/null | grep -q 'coreutils'] && alias ls='ls --color=always' || alias ls='ls -G'
aber ich bekomme immer den Alias „else“ und nicht den Alias „then“
Ich könnte es einfach rückgängig machen, aber ich vermute, dass das nichts nützen würde, da es nicht richtig funktioniert. Die einzige Möglichkeit, sicherzugehen, ist, es unter OSX auszuprobieren, und ich verwende gerade Ubuntu.
Antwort1
kurz und knapp;
Verwenden
ls --color=always > /dev/null 2>&1 && alias ls='ls --color=always' || alias ls='ls -G'`
Details...
[...]
werden nur benötigt, um bedingte Ausdrücke auszuwerten (Statistiken von Dateien, Stringvergleiche, numerische Vergleiche; siehe CONDITIONAL EXPRESSIONS
in bash(1)
). Sie würden dafür auch in einer if ... ; then ...; else
Konstruktion benötigt.
Für relativ einfache Konstrukte
if CONDITION; then
EXPR1
else
EXPR2
fi
kann ersetzt werden durch
CONDITION && EXPR1 || EXPR2
[...]
Wenn Sie es im ersten Fall nicht brauchen , brauchen Sie es auch im zweiten nicht.
In Ihrem Fall CONDITION
ist ls --version 2>/dev/null | grep -q 'coreutils'
dies der Rückgabecode von grep
. Sie können also einfach schreiben
ls --version 2>/dev/null | grep -q 'coreutils' && alias ls='ls --color=always' || alias ls='ls -G'
Übrigens: Es wäre einfacher, direkt zu prüfen, ob ls
Folgendes unterstützt wird :--color
ls --color=always > /dev/null 2>&1 && alias ls='ls --color=always' || alias ls='ls -G'
Antwort2
Mit zsh
kann es komprimiert werden zu:
if {ls --version|&grep -q coreutils} {alias ls='ls --color=always'
} else {alias ls='ls -G'}
Die cmd1 && cmd2 || cmd3
Konstruktion als Ersatz für if/then/else sollte grundsätzlich vermieden werden, da es nicht dasselbe ist.
In
cmd1 && cmd2 || cmd3`
cmd2
wird ausgeführt, wenn cmd1
zurückgegeben wird true
. Und cmd3
wird ausgeführt, wenn einer dercmd1
odercmd2
gibt false zurück.
In Ihrem Fall ist es sehr unwahrscheinlich, dass cmd2
( alias
) „false“ zurückgibt, aber im Allgemeinen vergisst man das Problem leicht. Deshalb ist es am besten, diese Konstruktion von vornherein zu vermeiden.
Die einzigerealDies kann beispielsweise dann nützlich sein, wenn Sie Code schreiben möchten, der sowohl in Bourne-ähnlichen als auch in csh-ähnlichen Shells (oder rc
-ähnlichen Shells, bei denen das ebenfalls funktioniert) funktioniert und die if/then/else
Konstrukte eine unterschiedliche Syntax aufweisen.