Dari C, apa cara termudah untuk menjalankan utilitas standar (mis. Ps) dan tidak ada yang lain?
Apakah POSIX menjamin bahwa, misalnya, suatu standar ps
ada /bin/ps
atau haruskah saya mereset variabel lingkungan PATH dengan apa yang saya dapatkan confstr(_CS_PATH, pathbuf, n);
dan kemudian menjalankan utilitas melalui pencarian PATH?
/bin
, yaitu/bin/ed
harus dapat digunakan jika ed diinstal. Saya tidak dapat menemukannya sekarang, tetapi saya tahu LSB bergantung padanya, dan saya telah berhasil membela laporan bug menggunakan itu sebagai alasan, jadi setidaknya itu benar pada beberapa titik. (Atau itu sesuatu selain POSUX dan saya salah ingat, tetapi sisanya benar.)Jawaban:
Tidak, itu tidak, terutama karena itu tidak mengharuskan sistem untuk menyesuaikan secara default , atau hanya mematuhi standar POSIX (dengan mengesampingkan standar lain).
Misalnya, Solaris (sistem yang memenuhi syarat sertifikasi) memilih kompatibilitas ke belakang untuk utilitasnya
/bin
, yang menjelaskan mengapa mereka berperilaku misterius, dan menyediakan utilitas yang sesuai dengan POSIX di lokasi yang berbeda (/usr/xpg4/bin
,/usr/xpg6/bin
... untuk versi XPG yang berbeda (sekarang digabung ke dalam POSIX) standar, yang sebenarnya merupakan bagian dari komponen opsional di Solaris).Bahkan
sh
tidak dijamin masuk/bin
. Pada Solaris,/bin/sh
dulu merupakan Bourne shell (jadi bukan POSIX compliant) hingga Solaris 10, sementara itu sekarang ksh93 di Solaris 11 (masih belum sepenuhnya memenuhi POSIX, tetapi dalam praktiknya lebih dari itu/usr/xpg4/bin/sh
).Dari C, Anda bisa menggunakan
exec*p()
dan menganggap Anda berada dalam lingkungan POSIX (khususnya terkaitPATH
variabel lingkungan).Anda juga bisa mengatur
PATH
variabel lingkunganAtau Anda bisa menentukan pada saat membangun jalur utilitas POSIX yang ingin Anda jalankan (mengingat bahwa pada beberapa sistem seperti yang GNU, Anda memerlukan langkah-langkah lebih lanjut seperti mengatur
POSIXLY_CORRECT
variabel untuk memastikan kepatuhan).Anda juga dapat mencoba hal-hal seperti:
Dengan harapan ada
sh
di$PATH
dalamnya, seperti Bourne, ada juga digetconf
dalamnya dan itu untuk versi POSIX yang Anda minati.sumber
/usr/bin/env
ada dan sebagian besar sesuai dengan POSIX/usr/bin/env
adalah retasan yang bahkan lebih portabel (dalam praktiknya) daripada/bin/sh
. Per POSIX, cara portabel untuk menulis skrip shell adalah tanpa#!
sama sekali . Jika suatu file dapat dieksekusi tetapiENOEXEC
(bukan biner yang valid),execvp
harus dijalankan melalui shell standar. :-) Tentu saja dalam praktiknya ini adalah ide yang buruk dan sebaiknya Anda gunakan saja#!/bin/sh
.$PATH
shell bukannya dari C.Sebenarnya, saya sebagian besar akan menjawab ya . POSIX tidak menjamin:
Meskipun tidak selalu dijamin bahwa setiap utilitas harus berada dalam direktori tertentu di semua sistem (
/bin/ps
), selalu dijamin dapat ditemukan di PATH default sistem, sebagai file yang dapat dieksekusi.Memang, satu-satunya cara standar yang ditentukan untuk melakukan ini dalam standar adalah (dalam C) melalui
unistd.h
_CS_PATH, atau dalam shell, melalui kombinasicommand
dangetconf
utilitas, yaitu,PATH="$(command -p getconf PATH)" command -v ps
harus selalu mengembalikan jalur absolut unik dari yang kompatibel dengan POSIXps
dipasok pada sistem tertentu. Yaitu, ketika implementasi-didefinisikan jalur mana yang termasuk dalam variabel PATH standar sistem, utiliti ini harus selalu tersedia, unik, dan sesuai, di salah satu jalur yang ditentukan di dalamnya.Lihat: < unistd.h >, perintah .
sumber
PATH=$(command -p getconf PATH)
hanya akan bekerja dari shell POSIX di lingkungan POSIX. POSIX tidak menentukan bagaimana Anda masuk ke lingkungan itu, hanya saja itu didokumentasikan. Misalnya, pada Solaris, Anda memiliki a/usr/xpg4/bin/getconf
dan a/usr/xpg6/bin/getconf
yang akan mengembalikan nilai yang berbeda untuk_CS_PATH
untuk dua versi standar yang berbeda dan tidak/usr/xpg4/bin
juga tidak/usr/xpg6/bin
ada dalam nilai default$PATH
. Ada/usr/bin/getconf
yang IIRC memberi Anda kesesuaian XPG4.sh
dari setiap shell default .getconf
perintah di default$PATH
sistem yang diberikan. Sebagai contoh, mendapatkan lingkungan POSIX mungkin melibatkan memulai lapisan emulasi, tanpanya Anda tidak akan menjalankan perintah seperti Unix sama sekali (pikirkan Windows misalnya). Setelah Anda berada di lingkungan yang patuh,getconf PATH
akan membuat Anda mendapatkan$PATH
untuk mencapai utilitas yang patuh, tetapi jika Anda berada di lingkungan POSIX, itu mungkin sudah menjadi masalahnya. Perhatikan bahwagetconf ps
mungkin kembalips
. Memilikips
builtin diperbolehkan.