Weź przykład z Autotools: trzymaj się najniższego wspólnego mianownika powłoki Bourne'a i POSIX - być może powiększonego sed
- jeśli musisz napisać coś, co musi działać wszędzie . Mogą istnieć systemy, w których coś się psuje, ale można obejść takie problemy, przepisując.
Na przykład niektóre starożytne systemy mają problemy z błędami ekspansji test
, czyli [
:
if [ $foo = bar ] ; then...
więc praktyka Autoconf polega na przepisywaniu go w podwójnych cudzysłowach z prefiksem jednoznakowym, na przykład:
if [ x"$foo" = "xbar" ] ; then...
Możesz również użyć "x$foo"
tutaj. Chroni to przed możliwością, która $foo
może być prawidłową opcją test(1)
, a ponieważ [
jest to alias test
, może źle interpretować wyrażenie. Rozwiązaniem jest ustawienie sytuacji, w której nieznany argument [
zawsze zaczyna się od x
, co oznacza, że nie może mieć specjalnego znaczenia [
.
(Autoconf zaleca również używanie test
zamiast [
, ale ta rada pojawia się jako reakcja na możliwe konflikty z M4 , który również używa [
swojej składni).
awk jest POSIX , więc teoretycznie jest dostępny wszędzie. Jest nawet w Busybox , więc będziesz miał awk
implementację nawet w niektórych bardzo restrykcyjnych wbudowanych systemach Linux. Mimo to, że będę mniej zaskoczony, aby natknąć się na systemie bez awk
niż sed
. Podejrzewam, że sprowadza się to do złożoności: prostsze narzędzia mają większe szanse na przetrwanie agresywnego triage.
Perl nie jest częścią żadnego rozpowszechnionego standardu, POSIX lub innego, więc po prostu nie możesz na niego liczyć, jeśli nie wiesz nic o środowisku docelowym. Perl nie jest domyślnie instalowany w:
- Cygwin
- FreeBSD i NetBSD
- „minimalna” instalacja dla niektórych Linuksów, w tym Slackware
- wiele osadzonych Linuksów, które w swojej przestrzeni użytkownika polegają głównie na Busybox
Podręcznik Autoconf zawiera rozdział dotyczący programowania przenośnych powłok, który powinien być dla ciebie pomocny. Narzędzia pokrowce Ostatnia sekcja podoba sed
, awk
i wiele innych.