পসিক্স কি কোনও স্ট্যান্ডার্ড ইউটিলিটিগুলির পাথের গ্যারান্টি দেয়?


22

সি থেকে, একটি স্ট্যান্ডার্ড ইউটিলিটি (উদাহরণস্বরূপ, পিএস) চালানোর সবচেয়ে সহজ উপায় এবং অন্য কোনওটি নেই?

পসিক্স কি গ্যারান্টি দেয় যে, উদাহরণস্বরূপ, একটি স্ট্যান্ডার্ড psরয়েছে /bin/psবা আমি কী পাথ পরিবেশের পরিবর্তনশীলটিকে যা পাই তার সাথে পুনরায় সেট করতে হবে confstr(_CS_PATH, pathbuf, n);এবং তারপরে প্যাথ-অনুসন্ধানের মাধ্যমে ইউটিলিটি চালানো উচিত?


আমার মাথার পিছনে রয়েছে যে পসিএক্স বলেছে, বেশ কয়েকটি কমান্ডের জন্য এড (1) (যা ম্যাক্সের জন্য গুরুত্বপূর্ণ ), যদি তারা উপলব্ধ থাকে তবে তাদের অবশ্যই আওতায় আসতে পারে /bin, /bin/edঅবশ্যই ব্যবহারযোগ্য হতে হবে যদি এড ইনস্টল করা থাকে। আমি এখনই এটি খুঁজে পাচ্ছি না, তবে আমি জানি যে এলএসবি এর উপর নির্ভর করে এবং আমি এটিকে যুক্তি হিসাবে সফলভাবে বগেরপোর্টগুলি রক্ষা করেছি, সুতরাং এটি অবশ্যই কমপক্ষে কোনও কোনও ক্ষেত্রে সত্য হওয়া উচিত। (অথবা এটা POSuX এবং আমি misremember চেয়ে কিছু অন্যান্য ছিল, কিন্তু বাকি সত্য।)
mirabilos

উত্তর:


33

না, এটি মূলত এই কারণে নয় যে এটির জন্য ডিফল্টরূপে সিস্টেমগুলি গ্রহণের প্রয়োজন হয় না , বা কেবল পসিক্স মান (অন্য কোনও মান বাদে) মেনে চলতে হয় ।

উদাহরণস্বরূপ, সোলারিস (একটি প্রত্যয়িত কমপ্লায়েন্ট সিস্টেম) এর ইউটিলিটিগুলির জন্য পশ্চাদপদ সামঞ্জস্যতা বেছে নিয়েছিল /bin, যা ব্যাখ্যা করে যে কেন তারা তীব্র উপায়ে আচরণ করে এবং পৃথক স্থানে POSIX- অনুবর্তী ইউটিলিটিগুলি সরবরাহ করে ( /usr/xpg4/bin, /usr/xpg6/bin... এক্সপিজির বিভিন্ন সংস্করণের জন্য (এখন মার্জ হয়েছে) পসিক্স) স্ট্যান্ডার্ডে, এগুলি আসলে সোলারিসে alচ্ছিক উপাদানগুলির অংশ)।

এমনকি এতে থাকার shনিশ্চয়তা নেই /bin। সোলারিসে /bin/shসোলারিস 10 পর্যন্ত বোর্ন শেল (তাই পসিক্স অনুগত নয়) হিসাবে ব্যবহৃত হত, এখন এটি সোলারিস 11-এ এখন ksh93 (এখনও পুরোপুরি পসিক্স অনুগত নয়, তবে অনুশীলনে আরও বেশি /usr/xpg4/bin/sh)।

সি থেকে, আপনি ব্যবহার করতে exec*p()এবং ধরে নিতে পারেন যে আপনি কোনও পসিক্স পরিবেশে (বিশেষত PATHপরিবেশের পরিবর্তনশীল সম্পর্কিত) in

আপনি PATHপরিবেশ পরিবর্তনশীল সেট করতে পারে

#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"...);

অথবা আপনি নির্ধারিত সময়ে আপনি যে পসিক্স ইউটিলিটিগুলি চালাতে চান তার পথ নির্ধারণ করতে পারেন (GNU এর মতো কিছু সিস্টেমে আপনার POSIXLY_CORRECTসম্মতি নিশ্চিতকরণের জন্য ভেরিয়েবল সেট করার মতো আরও পদক্ষেপ প্রয়োজন )।

আপনি এর মতো জিনিসও চেষ্টা করে দেখতে পারেন:

execlp("sh", "sh", "-c", "PATH=`getconf PATH`${PATH+:$PATH};export PATH;"
                         "unset IFS;shift \"$1\";"
                         "exec ${1+\"$@\"}", "2", "1", "ps", "-A"...);

আশা নেই যে একটি shমধ্যে $PATH, এটা বোর্ন মত, এর রয়েছে একটি করে যে getconfএবং এটি POSIX তুমি আগ্রহী এর সংস্করণের জন্য এক যে।


তাহলে আপনি # এর জন্য কী করেন??
জোশুয়া

13
@ জোশুয়া: আপনি প্রার্থনা করেন যা /usr/bin/envবিদ্যমান এবং বেশিরভাগ পসিএক্স -অনুগত।
কেভিন

3
@ কেভিন বা আপনি নিজের প্যালিয়ো-ইউনিক্সের স্নিগ্ধতার সাথে নিজেকে পরিচিত এবং # টি সামঞ্জস্য করুন! সঠিক পথ ব্যবহার করার জন্য লাইন।
কাস

3
@Kevin: নং /usr/bin/envএকটি হল এমনকি কম পোর্টেবল (বাস্তবে) তুলনায় হ্যাক /bin/sh। প্রতি POSIX, একটি শেল স্ক্রিপ্ট লিখতে পোর্টেবল উপায় সঙ্গে #!এ সব । যদি কোনও ফাইল এক্সিকিউটেবল হয় তবে ENOEXEC(বৈধ বাইনারি নয়), execvpএটি স্ট্যান্ডার্ড শেলের মাধ্যমে চালিত করতে হয়। :-) অবশ্যই অনুশীলনে এটি একটি খারাপ ধারণা এবং আপনার কেবল ব্যবহার করা উচিত #!/bin/sh
আর ..

2
@ জিফনিক্সন, আপনি যে অংশটি উল্লেখ করছেন সেটি হ'ল বিকল্প হিসাবে যখন আপনি না _POSIX_C_SOURCE না ব্যবহার করতে বা করতে চান না। এটি $PATHসি থেকে পরিবর্তে শেল থেকে সেটিংটি করে
স্টাফেন চাজেলাস

3

আসলে, আমি বেশিরভাগ ক্ষেত্রে হ্যাঁ উত্তর করব । পসিক্স গ্যারান্টি দেয়:

  1. যে হয় প্রতিটি নিদিষ্ট উপযোগ মান-অনুবর্তী সংস্করণে একটি সুনির্দিষ্ট পাথ একটি
  2. এবং, আপনি অবশ্যই এই পরম পথটি সন্ধান করতে সক্ষম হবেন এবং এই ইউটিলিটিটি কার্যকর করতে সক্ষম হবেন।

যদিও এটির নিশ্চয়তা নেই যে প্রতিটি ইউটিলিটি সমস্ত সিস্টেমে একটি নির্দিষ্ট ডিরেক্টরিতে থাকতে পারে ( /bin/ps) তবে এটি সর্বদা নির্বাহযোগ্য ফাইল হিসাবে সিস্টেম ডিফল্ট PATH-এ পাওয়া যাবে বলে গ্যারান্টিযুক্ত ।

বস্তুত, মান এই কাজটি করার একমাত্র মান-নির্দিষ্ট পথ মাধ্যমে (সি) হল unistd.h, এস _CS_PATH, অথবা শেল এ 'সংমিশ্রণ মাধ্যমে commandএবং getconfইউটিলিটিগুলি, অর্থাত, PATH="$(command -p getconf PATH)" command -v psসবসময় অনন্য পথটি ফিরে আসবে POSIX-অনুবর্তী একটি নির্দিষ্ট সিস্টেমে সরবরাহ করা। এটি, যখন এটি প্রয়োগ-সংজ্ঞায়িত করা হয় কোন ডিফল্ট সিস্টেম ডিফল্ট PATH ভেরিয়েবলের মধ্যে কোন পাথগুলি অন্তর্ভুক্ত রয়েছে, এই ইউটিউটিগুলি অবশ্যই সেখানে নির্দিষ্ট করা একটি পাথের মধ্যে সর্বদা উপলভ্য, অনন্য এবং মেনে চলতে হবে।ps

দেখুন: < unistd.h >, কমান্ড


তবে শ, মুরগির ও ডিমের সমস্যা আছে। এটি PATH=$(command -p getconf PATH)কেবলমাত্র পসিক্স পরিবেশে একটি পসিক্স শেল থেকে কাজ করবে। আপনি কীভাবে সেই পরিবেশে প্রবেশ করবেন তা পসিক্স নির্দিষ্ট করে না, কেবল এটি নথিভুক্ত করা হবে। উদাহরণস্বরূপ, সোলারিস, আপনি একটি আছে /usr/xpg4/bin/getconfএবং /usr/xpg6/bin/getconfযার জন্য বিভিন্ন মান ফিরে আসবে _CS_PATHমান দুটি ভিন্ন সংস্করণের জন্য এবং কেউই /usr/xpg4/binকিংবা /usr/xpg6/binডিফল্ট মান রয়েছে $PATH। এমন একটি রয়েছে /usr/bin/getconfযা আইআইআরসি আপনাকে এক্সপিজি 4 কনফারেন্স দেয়।
স্টাফেন চেজেলাস

এমনকি সোলারিস 11+ (ইউনিক্স 03+ সার্টিফাইড) সংস্করণগুলির জন্যও কি এটি সত্য? আমি সর্বদা `` `অ্যাপ্লিকেশনগুলি পড়েছি ... getconf PATH দ্বারা প্রত্যাবর্তিত PATH জিজ্ঞাসাবাদ দ্বারা নির্ধারণ করা উচিত, নিশ্চিত করা হয়েছে যে ফিরে আসা পথটি একটি নিখরচায় পথ নয় এবং শেলটি অন্তর্নির্মিত নয়। উদাহরণস্বরূপ, স্ট্যান্ডার্ড sh ইউটিলিটির অবস্থান নির্ধারণ করতে: কমান্ড -v sh কিছু বাস্তবায়নের ক্ষেত্রে এটি ফিরে আসতে পারে: / usr / xpg4 / bin / sh `` `এর অর্থ এটি shকোনও ডিফল্ট শেল থেকে কোনও পসিক্সের সাথে অনুগত একটি প্রবেশিকা হতে হবে ।
জিফ নিক্সন

1
পসিক্সে এমন কিছুই নেই যা বলে যে প্রদত্ত সিস্টেমের getconfডিফল্টে একটি কমান্ড থাকা উচিত $PATH। উদাহরণস্বরূপ, পসিক্স পরিবেশ পাওয়ার ক্ষেত্রে একটি এমুলেশন স্তর শুরু করা জড়িত থাকতে পারে, এটি ছাড়া আপনি কোনও ইউনিক্সের মতো কমান্ড চালাতে পারবেন না (উদাহরণস্বরূপ উইন্ডোজ ভাবেন)। একবার আপনি একটি অনুবর্তী পরিবেশে হয়, getconf PATH আপনি একটি পাবেন $PATHঅনুবর্তী ইউটিলিটি পেতে, কিন্তু আপনি যদি একটি POSIX পরিবেশ ছিল, যে সম্ভবত ইতিমধ্যে কেস। নোট যে getconf psফিরে আসতে পারে pspsবিল্টিন থাকার অনুমতি রয়েছে।
স্টাফেন চেজেলাস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.