2012-07-17 3 views
12

Ich schreibe gerade ein Bash Testing Framework, das so portabel wie möglich sein soll.Was ist tragbarer? Echo -e oder Verwendung von Printf?

So, an einem Punkt, musste ich eine führende Newline gefolgt von etwas Text drucken, der mehrere erweiterte Variablen enthält. Dies ist die Lösung, die ich verwendet habe.

Dies scheint in Ordnung, aber ich bin mir nicht sicher, wie tragbar das im Vergleich zum Drucken der Linie mit z. printf?

Irgendwelche Ideen oder Hinweise, wo ich einige Hinweise finden könnte?

+3

von ‚tragbar‘ , meinst du portabel zwischen verschiedenen shells (was bedeutet nicht bash) oder zwischen verschiedenen bash-versionen? –

+1

Nicht klar, wie ein Bash Testing Framework mit etwas anderem als bash kompatibel sein muss. Ich denke, vielleicht ist Ihr Punkt, dass einige OS printf nicht haben, und als solche ist wirklich nicht Teil der bash, sondern bietet Inkompatibilitäten? Haben Sie untersucht, wie viel Arbeitskompatibilität in der Implementierung von autoconf und ./configure steckt? Warum nicht nur ein paar Tests oben, 'wenn [[! -f/bin/printf]]; echo -e "bitte habe printf installiert, bevor du den Rest dieses Skripts ausführst"; Fi ?? Viel Glück. – shellter

+2

Ich glaube 'printf' ist technisch immer noch portabler, weil das Standard' xpg_echo' Verhalten zwischen den Plattformen sogar innerhalb von Bash variieren kann (also können Sie es explizit setzen, wenn Sie wirklich wollen.) – ormaaj

Antwort

20

printf ist tragbarer. Es sollte immer über echo -e bevorzugt werden. Wenn Sie speziell bash/zsh/ksh targetieren, ist echo $'...' auch in Ordnung. Wenn Sie speziell auf zsh oder ksh abzielen, ist print in Ordnung.

POSIX (letzter Link) diskutiert auch echo -n Probleme, die auch vermieden werden sollte. Grundsätzlich nie Optionen verwenden, um echo und für Portabilität, Verwendung printf.)

+2

+1 gute Antwort. – jordanm

1

Die meisten tragbaren (in Bezug auf die Portabilität zu alten Systemen ohne printf) Lösung für führende newlines offensichtlich ist

echo 
echo "$number_of_specs ${units}, $number_of_specs_failed failed"