2012-07-17 11 views
12

Obecnie piszę framework testowania bash, który wymaga możliwie największej przenośności.Co jest bardziej przenośne? echo -e lub używając printf?

Tak więc, w pewnym momencie musiałem wydrukować pierwszy wiersz, a następnie tekst zawierający kilka rozszerzonych zmiennych. To jest rozwiązanie, którego użyłem.

echo -e "\n$number_of_specs ${units}, $number_of_specs_failed failed" 

Wydaje się, że to w porządku, ale nie jestem pewien, jak przenośne jest to w porównaniu do drukowania linii za pomocą np. printf?

Jakieś pomysły lub wskazówki, w których mogłem znaleźć odniesienia?

+3

Przez „przenośny” , masz na myśli przenośną między różnymi powłokami (co oznacza, że ​​nie jest bash) lub między różnymi wersjami bash? –

+1

Nie jest jasne, w jaki sposób struktura testowania bash musi być zgodna z cokolwiek innego niż bash. Sądzę, że twoim zdaniem niektóre systemy operacyjne nie mają printf i jako takie naprawdę nie są częścią basha, ale zapewniają niekompatybilność? Czy sprawdziłeś, ile kosztuje kompatybilność w pracy z implementacją autoconf i ./configure? Dlaczego nie tylko niektóre testy na górze, 'if [[! -f/bin/printf]]; echo -e "proszę mieć zainstalowany printf przed uruchomieniem reszty tego skryptu"; fi ?? Powodzenia. – shellter

+2

Wierzę, że 'printf' jest technicznie jeszcze bardziej przenośny, ponieważ domyślne zachowanie' xpg_echo' może być różne w różnych platformach, nawet w Bashu (więc możesz go ustawić jawnie, jeśli naprawdę chcesz.) – ormaaj

Odpowiedz

20

printf jest bardziej przenośny. Zawsze powinno być preferowane ponad echo -e. Jeśli kierowanie na bash/zsh/ksh w szczególności, echo $'...' jest również w porządku. Jeśli celujesz w szczególności dla Zsh lub Ksh, print jest w porządku.

POSIX (ostatni link) omawia również echo -n problemy, które należy również unikać. W zasadzie, nigdy nie używać opcji echo, i dla przenośności, użycie printf).

+2

+1 dobra odpowiedź. – jordanm

1

Najbardziej przenośny (pod względem przenośności do dawnych układów bez printf) rozwiązania dla wiodących nowej linii jest oczywiście

echo 
echo "$number_of_specs ${units}, $number_of_specs_failed failed" 
Powiązane problemy