পোর্টেবল শেল প্রোগ্রামিংয়ের জন্য সংস্থানসমূহ


65

পোর্টেবল শেল প্রোগ্রামিংয়ের জন্য কোন সংস্থান রয়েছে? চূড়ান্ত উত্তর হ'ল সমস্ত লক্ষ্যযুক্ত প্ল্যাটফর্মগুলিতে পরীক্ষা করা, তবে এটি খুব কমই ব্যবহারিক।

POSIX / একক ইউনিক্স স্পেসিফিকেশন একটি সূচনা, তবে এটি আপনাকে তন্ন তন্ন বলে প্রতিটি বাস্তবায়ন সমর্থনে মাত্রা, না কি সাধারণ এক্সটেনশন বিদ্যমান। আপনি প্রতিটি প্রয়োগের ডকুমেন্টেশন পড়তে পারেন, তবে এটি খুব সময়সাপেক্ষ এবং সম্পূর্ণ সঠিক নয়।

আমি আমার কাছে মনে করি যে একটি আদর্শ ফর্ম্যাট হ'ল এক ধরণের POSIX স্পেকের সম্প্রদায়-বর্ণিত সংস্করণ, যেখানে প্রতিটি বৈশিষ্ট্যটি বিভিন্ন বাস্তবায়নের মধ্যে এর সমর্থন স্তর দ্বারা টীকায়িত হয়। সেখানে কি এমন জিনিস আছে? বা অন্য কোন দরকারী সংস্থান আছে?

উদাহরণস্বরূপ, সেখানে সোভেন মাসচেকের শেল বহনযোগ্যতা পৃষ্ঠাগুলি রয়েছে তবে এটি কেবল সিনট্যাকটিক উপাদান এবং কয়েকটি বিল্ট-ইন সম্পর্কে এবং কেবল পুরানো শাঁসগুলি coversেকে রাখে। আমি আরও ব্যাপক সংস্থান খুঁজছি।


2
এনবি দয়া করে একটি নির্দিষ্ট প্রয়োগের কনফরমেশন ডকুমেন্টটি উদ্ধৃত করার জন্য এখানে উত্তর দিবেন না। আপনার যদি এর মধ্যে একটি থাকে তবে সংশ্লিষ্ট ট্যাগ উইকি একটি ভাল জায়গা হবে।
গিলস 21

1
কারও জন্য autoconfএবং Metaconfig(পার্ল rn) এর সংশোধন ইতিহাস খনন করতে হবে এবং সমস্ত কৌশল এবং তাদের ব্যাখ্যামূলক মন্তব্য এক জায়গায় সংগ্রহ করতে হবে।
গিকোসৌর

@ জেকোসোসর: ভাল পরামর্শ। আমি কখনও অটোকনফের অভ্যন্তরীণ দিকে নজর রাখিনি, নিজের স্ক্রিপ্টগুলি লেখার সময় গাইড হিসাবে কেউ ব্যবহার করতে পারে এমন কিছু আছে কি? যদি তা হয় তবে এটি আমার প্রশ্নের উত্তরের উত্তর হতে পারে, যদিও এটি একটি নির্দিষ্ট সিদ্ধান্ত নাও থাকে।
গিলস

5
আমি নিশ্চিত যে আপনি উভয়ই এটি সহজেই খুঁজে পেতে পারেন তবে এই থ্রেডটি অনুসরণকারী অন্যান্য লোকের উপকারের জন্য, অটোকনফ
জে টেলর

উত্তর:


32

অটোকনফ ম্যানুয়ালটিতে পোর্টেবল শেল প্রোগ্রামিংয়ের একটি বিভাগ রয়েছে ।

যদিও এটি পসিক্সকে নির্দিষ্টভাবে লক্ষ্যবস্তু করে না, পোর্টেবল শেল কোড লেখার চেষ্টা করার সময় এটি কী করবেন এবং কী করবেন না সম্ভবত এটির সবচেয়ে সম্পূর্ণ সংগ্রহ।


3
এটি অন্যতম সেরা সম্পদ এবং এম 4-তে কোড লেখার সময় নির্মিত হয়েছিল যাতে শেল কোড তৈরি করতে হয়েছিল যা যতগুলি সম্ভব শেল জুড়ে বহনযোগ্য ছিল।
টিম পোস্ট

6

হেরলুম বোর্ন শেল ছাড়াও dashএবং poshরয়েছে bournesh(বা bsh), এটি ব্যাশিজম সনাক্ত করতে ব্যবহার করা যেতে পারে ।

হেরলুম প্রজেক্টে "দ্য হেরলুম টুলকস্ট" অন্তর্ভুক্ত রয়েছে, যা 100 টিরও বেশি মানক ইউনিক্স ইউটিলিটিগুলির সংকলন (যা কমান্ড লাইন বিকল্পগুলির তুলনায় প্রাথমিক পয়েন্ট হিসাবে কাজ করতে পারে)।


2
নোট করুন যে বোর্ন শেলটি পসিক্স শেল নয়, আপনার স্ক্রিপ্টটি বোর্ন শেলকে পোর্টেবল করার অর্থ আপনার স্ক্রিপ্টের বাক্য গঠনটি বর্ন শেলের সিনট্যাক্সের মধ্যে স্ট্যান্ডার্ড পসিক্স ভাষা থেকে সাধারণ ডিনোমিনেটরে ডাউনগ্রেড করার অর্থ। আপনি যদি প্রাচীন সিস্টেমে পোর্টেবল হতে না চান তবে (বা সোলারিস 10 এবং তার আগের এবং আপনার কাছে সেখানে / ইউএসআর / এক্সপিজি 4 / বিন ছিল এমন স্ট্যান্ডার্ড শে ব্যবহার করার পছন্দ নেই) মতামতের মূল্য নেই।
স্টাফেন চেজেলাস

5

অনুরূপ এই উত্তর , আপনার স্ক্রিপ্টের নির্বাহ চেষ্টা সর্বোকৃষ্ট

এছাড়াও, POSIXLY_CORRECTপরিবেশের পরিবর্তনশীলটিকে সত্য হিসাবে নির্ধারণ করতে ভুলবেন না , কারণ এটি পসিক্স মানগুলিতে আরও কঠোরভাবে মেনে চলার জন্য অনেক প্রোগ্রাম (কেবল শেল নয়) তৈরি করে।


4

ড্যাশ ব্যবহার করে আপনার স্ক্রিপ্টগুলি লিখতে শুরু করা হতে পারে।


3
Ksh / bash বৈশিষ্ট্যগুলির উপর দুর্ঘটনাকালীন নির্ভরতা এড়াতে ড্যাশ দিয়ে পরীক্ষা করা সর্বনিম্নতম, তবে আমি এর চেয়ে আরও বেশি পরে রয়েছি: অন্যান্য শেলগুলির ঘাটতিগুলি সম্পর্কে (যেমন zsh এর দুর্বল ফাঁদ পরিচালনা), এবং সর্বোপরি শেল ইউটিলিটিগুলিতে (যেমন ওপেনবিএসডি এর findএখনও কার্যকর করা হয়নি -exec +)।
গিলস

FWIW, OpenBSD এর findআছে -exec utility {} +আজকাল।
কুসালানন্দ

2

কিছুটা বাড়ানোর জন্য, আপনি checkbashismsদেবিয়ান / উবুন্টুর devscriptsপ্যাকেজে চেষ্টা করতে পারেন ।

এটি নিখুঁত নয়, তবে এটি বিদ্যমান শুরুর পয়েন্ট হওয়ার সুবিধা রয়েছে। উদাহরণস্বরূপ, এটি জিএনইউ বনাম বিএসডি / অন্যান্য পার্থক্যগুলির সাথে sed/ findসম্পর্কিত ধ্রুপদী গ্লিটগুলি দেখতে পাচ্ছে না ।

ডিফল্টরূপে এটি ডিবিয়ান + ড্যাশ ওরিয়েন্টেড, -pপতাকাটি আপনার ক্ষেত্রে কার্যকর হতে পারে।


2

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

একমাত্র সমস্যাটি হ'ল /bin/shকখনও কখনও পসিক্স শেল নয়। এবং আপনার অবশ্যই কার্যকর করতে হবে #!এমন কার্যকর স্ক্রিপ্টগুলিতে লাইনটিকে হার্ড-কোড করতে হবে ; আপনি কেবল ব্যবহারকারীকে সমস্যাটি গবেষণা করতে বলতে এবং তারপরে আপনার স্ক্রিপ্টটি অনুরোধ করতে পারবেন না /path/to/posix/shell myscript

সুতরাং, কৌশলটি হ'ল আপনার স্ক্রিপ্টে পসিক্স বৈশিষ্ট্যগুলি ব্যবহার করা, তবে স্ক্রিপ্টটি পজিক্স শেলটি স্বয়ংক্রিয়ভাবে সন্ধান করুন। এটি করার একটি উপায় হ'ল:

#!/bin/sh

# At this point, we may be running under some old shell
# we have to tread carefully.

# note how we use test rather than [ ] syntax and avoid
# depending on test with no argument producing a failure;
# i.e. "test $posix_shell".

if ! test x$posix_shell = x ; then
  # the three possible shell paths are just an example;
  # please extend as necessary.

  for shell in /usr/xpg4/bin/sh /bin/bash /usr/bin/bash ; do
    if test -x $shell ; then
       posix_shell=$shell
    fi
  done
  if test x$posix_shell = x ; then
    echo "no POSIX shell found"
    exit 1
    # or we could avoid bailing here and just fall back on /bin/sh:
    # echo "falling back on /bin/sh: cross your fingers that it works"
    # posix_shell=/bin/sh
  fi
  export posix_shell

  # plain "$@" is broken in ancient shells! 
  # I seem to recall ${@+"$@"}: not sure if that's the right trick.

  exec $posix_shell $0 ${@+"$@"}  # can we count on exec in legacy shells? 
fi

# phew, at this point in the script we have been re-executed and are
# being interpreted by some reasonably modern shell. We can use $(...)
# command substitution, and other features.

কোড উত্পন্নকরণের মতো অন্যান্য পদ্ধতি রয়েছে। আপনার স্ক্রিপ্টগুলি একটি ছোট স্ক্রিপ্টের সাথে বুস্ট্র্যাপ করুন যা কোনও # ছাড়াই স্ক্রিপ্ট ফাইলগুলির একটি বডি নেয়! লাইন, এবং একটি যোগ করুন।

সবচেয়ে খারাপ কাজটি আপনি করতে পারেন সম্পূর্ণ স্ক্রিপ্টগুলি এমনভাবে লেখা শুরু করা যাতে তারা 1981 সাল থেকে বোর্ন শেলের উপর দিয়ে চলে This এটি কেবল তখনই প্রয়োজন যদি আপনার এমন কোনও সিস্টেমের জন্য লিখতে হবে যা সত্যিকার অর্থে অন্য কোনও শেল নেই This ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.