Không, không, chủ yếu vì lý do đó nó không đòi hỏi hệ thống phải tuân theo mặc định , hoặc để tuân thủ chỉ tiêu chuẩn POSIX (để loại trừ bất kỳ tiêu chuẩn khác).
Chẳng hạn, Solaris (một hệ thống tuân thủ được chứng nhận) đã chọn khả năng tương thích ngược cho các tiện ích của nó /bin
, điều này giải thích tại sao chúng hoạt động theo cách phức tạp và cung cấp các tiện ích tuân thủ POSIX ở các vị trí riêng biệt ( /usr/xpg4/bin
, /usr/xpg6/bin
... cho các phiên bản XPG khác nhau (hiện đã được hợp nhất theo tiêu chuẩn POSIX), những người thực sự là một phần của các thành phần tùy chọn trong Solaris).
Thậm chí sh
không được đảm bảo để được trong /bin
. Trên Solaris, /bin/sh
từng là vỏ Bourne (không tuân thủ POSIX) cho đến Solaris 10, trong khi bây giờ là ksh93 trong Solaris 11 (vẫn chưa hoàn toàn tuân thủ POSIX, nhưng thực tế còn hơn thế /usr/xpg4/bin/sh
).
Từ C, bạn có thể sử dụng exec*p()
và giả sử bạn đang ở trong môi trường POSIX (đặc biệt là về PATH
biến môi trường).
Bạn cũng có thể đặt PATH
biến môi trường
#define _POSIX_C_SOURCE=200809L /* before any #include */
...
confstr(_CS_PATH, buf, sizeof(buf)); /* maybe append the original
* PATH if need be */
setenv("PATH", buf, 1);
exec*p("ps"...);
Hoặc bạn có thể xác định tại thời điểm xây dựng đường dẫn của các tiện ích POSIX mà bạn muốn chạy (lưu ý rằng trên một số hệ thống như GNU, bạn cần nhiều bước hơn như đặt POSIXLY_CORRECT
biến để đảm bảo tuân thủ).
Bạn cũng có thể thử những thứ như:
execlp("sh", "sh", "-c", "PATH=`getconf PATH`${PATH+:$PATH};export PATH;"
"unset IFS;shift \"$1\";"
"exec ${1+\"$@\"}", "2", "1", "ps", "-A"...);
Với hy vọng rằng có một sh
trong $PATH
, mà nó là Bourne-như thế nào, mà đó cũng là một getconf
và rằng đó là một cho phiên bản của POSIX bạn trong tâm đang.
/bin
, tức là/bin/ed
phải có thể sử dụng được nếu ed được cài đặt. Tôi không thể tìm thấy nó ngay bây giờ, nhưng tôi biết LSB phụ thuộc vào nó và tôi đã bảo vệ thành công bugreports bằng cách sử dụng nó như là lý do, vì vậy ít nhất nó phải đúng ở một số điểm. (Hoặc đó là một cái gì đó khác với POSuX và tôi đã đánh giá sai, nhưng phần còn lại là đúng.)