Manakah yang paling portabel dari sed, awk, perl dan sh?

15

Bisakah seseorang meletakkan alat-alat ini agar mudah dibawa? Manakah dari ini yang pasti dapat ditemukan pada sistem * nix yang paling minimal sekalipun? Apakah ada di antara mereka yang 100% yakin untuk hadir? Dugaan saya adalah bahwa urutannya adalah sebagai berikut:

  1. awk
  2. sed
  3. SH
  4. perl

Sementara saya membayangkan ada sistem yang tidak default ke shell bourne, beberapa shell akan hadir sebagai default, apakah itu akan selalu di /bin/sh? Mungkin tidak jika itu bukan shell tipe-bourne. Keduanya awkdan sedmemiliki halaman yang menjelaskannya pada spesifikasi POSIX sehingga mungkin mereka akan selalu ada. Apakah begitu? Dapatkah saya yakin bahwa keduanya akan diinstal pada * nix? Termasuk sistem tertanam?

terdon
sumber
Sistem embedded sering mengorbankan portabilitas agar tetap minimal. Banyak yang tidak sesuai dengan POSIX.
jordanm
@jordanm apakah itu berarti mereka mungkin tidak memiliki semua ini? Saya mengasumsikan sistem yang menyediakan setidaknya antarmuka shell minimal. Saya tahu bahwa busybox menyediakan sh, awkdan sedmisalnya dan NAS berbasis busybox saya juga memiliki perl.
terdon
1
Anda mungkin memilikinya, tetapi apa yang mereka lakukan akan bervariasi di seluruh sistem, sehingga pertanyaannya tidak masuk akal seperti yang dinyatakan.
Stéphane Chazelas
@StephaneChazelas ah, bisakah Anda membantu saya mempersempitnya? Apakah tidak mungkin untuk mengurutkan ini dalam hal seberapa besar kemungkinan mereka ditemukan pada sistem X? Pengalaman saya adalah Linux dan beberapa sistem NAS tertanam. Saya tahu Anda tidak akan pernah mendapatkan GNU / Linux tanpa semua 4 ini tetapi tidak bisakah Anda memberi saya ide yang mana yang paling aman untuk dianggap hadir?
terdon

Jawaban:

15

Manakah yang paling portabel dari sed, awk, perl dan sh?

sed, shdan awkportabel yang ditentukan oleh POSIX, perltidak didukung oleh standar.

Bisakah seseorang meletakkan alat-alat ini agar mudah dibawa?

Jika Anda tetap menggunakan kode yang sesuai, seharusnya tidak ada urutan portabilitas untuk tiga perintah POSIX.

Manakah dari ini yang pasti dapat ditemukan pada sistem * nix yang paling minimal sekalipun?

Tiga yang POSIX bersama dengan banyak utilitas lain wajib untuk OS menjadi POSIX. OS kekurangan beberapa dari mereka karena minimisasi, atau menyediakan implementasi yang tidak lengkap / tidak sesuai memang ada.

Sebenarnya, sebagian besar (jika tidak semua) Unix sumber bebas dan terbuka seperti sistem operasi mungkin tidak akan melewati proses penyesuaian jika mereka mencoba, dan mereka tidak pernah mencoba lagi.

Apakah ada di antara mereka yang 100% yakin untuk hadir?

Saya akan terkejut menemukan * nix seperti OS yang tidak memiliki shell berdasarkan sintaks Bourne, tetapi segala sesuatu mungkin terjadi, terutama dengan sistem embedded.

Dugaan saya adalah bahwa urutannya adalah sebagai berikut: Beberapa shell akan hadir sebagai default, apakah itu selalu di / bin / sh?

/bin/shkemungkinan merupakan shell keluarga sintaks Bourne tetapi tidak dijamin sesuai dengan POSIX, bahkan dengan sistem yang sesuai dengan POSIX. Sebagai contoh, ini ada /usr/xpg4/bin/shpada Solaris 10 dan yang lebih tua sementara itu /bin/shadalah shell Bourne asli yang bukan POSIX.

Jlliagre
sumber
12

Ambil petunjuk dari Autotools: tetap pada penyebut umum terendah dari Bourne dan POSIX shell - mungkin ditambah oleh sed- jika Anda harus menulis sesuatu yang harus bekerja di mana-mana . Mungkin ada sistem di mana sesuatu rusak, tetapi Anda dapat mengatasi masalah tersebut dengan menulis ulang.

Sebagai contoh, beberapa sistem kuno memiliki masalah dengan kesalahan ekspansi test, alias [:

 if [ $foo = bar ] ; then...

jadi praktik Autoconf adalah menulis ulang dalam tanda kutip ganda dengan awalan satu karakter, seperti:

 if [ x"$foo" = "xbar" ] ; then...

Anda juga bisa menggunakannya di "x$foo"sini. Penjaga ini terhadap kemungkinan yang $foobisa menjadi opsi yang valid untuk test(1), dan karena [merupakan alias untuk test, itu bisa salah menafsirkan ekspresi. Solusinya adalah mengatur situasi di mana argumen yang tidak diketahui [selalu dimulai x, yang artinya tidak dapat memiliki makna khusus [.

(Autoconf juga merekomendasikan penggunaan testdaripada [, tetapi saran itu muncul sebagai reaksi terhadap kemungkinan konflik dengan M4 , yang juga digunakan [dalam sintaksisnya.)

awk adalah POSIX , jadi secara teoritis itu tersedia di mana-mana. Bahkan di Busybox , jadi Anda akan memiliki awkimplementasi bahkan di beberapa sistem Linux tertanam yang sangat ketat. Namun, saya akan kurang terkejut menemukan sistem tanpa awkdibandingkan sed. Saya kira itu datang ke kompleksitas: alat sederhana lebih mungkin untuk bertahan hidup triase agresif.

Perl bukan bagian dari standar yang tersebar luas, POSIX atau yang lainnya, jadi Anda tidak dapat mengandalkannya jika Anda tidak mengetahui sebelumnya tentang lingkungan target. Perl tidak diinstal secara default di:

  • Cygwin
  • FreeBSD dan NetBSD
  • Instalasi "minimal" untuk beberapa Linux, termasuk Slackware
  • banyak Linux tertanam yang bergantung terutama pada Busybox untuk tanah pengguna mereka

Manual Autoconf memiliki bab tentang pemrograman shell portabel yang seharusnya membantu Anda. Alat bagian terakhir selimut seperti sed, awk, dan banyak lainnya.

Warren Young
sumber
Terima kasih, tapi saya bertanya-tanya tentang urutan portabilitas ini. Jika saya membacanya dengan benar, Anda menyarankan itu shdan sedmerupakan yang paling portabel. OK, bagaimana dengan yang lain? Dan shbenarkah itu portabel? Bagaimana jika shell default adalah turunan C-shell? Apakah sistem seperti itu masih memiliki symlink /bin/sh?
terdon
Terima kasih atas hasil editnya, itu masalahnya, keduanya seddan awkdisediakan oleh busybox, mengapa Anda lebih terkejut menemukan sedketidakhadiran? Apakah Anda tahu jika busybox alternatif juga menyediakan sed dan awk?
terdon
Re: POSIX vs Bourne shell , tulis ulang saran untuk tetap menggunakan LCD keduanya. Re: test kutip , saya salah ingat alasan untuk itu, tetapi menemukan bab di manual Autoconf di mana alasannya tercakup, dan mengedit jawaban sesuai. Re: sed vs awk dan Busybox , saya menjelaskan bahwa: kompleksitas dan triase yang lebih besar. sedtidak lebih sedikit, jadi binernya akan lebih kecil, maka ada lebih sedikit alasan untuk menghapusnya daripada awk, yang cukup rumit. (20 kiB vs 48 kiB di sistem saya.) Re: Alternatif Busybox , saya tidak mengetahui adanya alternatif one-stop-shopping lainnya.
Warren Young
1 Karena saya setuju dengan premis umum Anda di sini (yang common denominator terendah akan menjadi semacam sh- aneh bahwa jajaran Terdon awkdan sed? Atas o_O ini) meskipun ini hanya kebetulan dengan tujuan Autotool, karena beberapa lingkungan, terutama yang kecil, mungkin tidak dimaksudkan untuk bangunan, titik.
goldilocks
1
@ WarrenYoung, itu adalah hal yang saya pikirkan. Saya (tidak) tidak tahu apakah semua sistem * nix akan benar-benar memiliki shell bourne yang terinstal secara default. Jika mereka semua memiliki /bin/sh, maka semuanya berbeda tetapi saya tidak tahu bahwa semua akan memilikinya. Maaf karena tidak menerima ini, saya terpecah antara jawaban Anda dan jlliagre yang keduanya menjawab pertanyaan saya. Saya memilih nya karena itu mengatasinya lebih langsung dan karena dia kurang perwakilan :).
terdon