উবুন্টু-ওএসএক্স সামঞ্জস্যতা এবং ব্যবহারের সহজতা এবং পসিক্সের জন্য #! / বিন / শ বা #! / বিন / ব্যাশ ব্যবহার করুন


18

আমি জানি যে আমি কাঙ্ক্ষিত শেলটি শুরু করতে স্ক্রিপ্টগুলির প্রথম লাইন হিসাবে ব্যবহার করতে পারি।

চান #!/bin/shযদি সব UNIX সিস্টেমের সাথে সামঞ্জস্য একটি পরম প্রয়োজন সুপারিশ করা হবে?

আমার ক্ষেত্রে কেবল ওএস 'আমি যত্ন করি উবুন্টু (দেবিয়ান) এবং ওএসএক্স। এটি প্রদত্ত, আমি কি ব্যবহার করতে পারি #!/bin/bashএবং নিশ্চিত হতে পারি যে এটি উভয় সিস্টেমে কাজ করবে?
এটি কি কমান্ডগুলির জন্য আরও আধুনিক এবং আরও পরিষ্কার সিন্টেক্স সহ স্ক্রিপ্টগুলি ব্যবহার করা সহজ করে তুলবে? ব্যবহার করা কি #!/bin/shপসিক্স ব্যবহারের সাথে সম্পর্কিত?


1
সম্ভবত লক্ষ্য করার মতো বিষয় যে অনেকগুলি ডিস্ট্রো মার্জ শুরু করেছে /binএবং /usr/bin। ফলস্বরূপ, #!/usr/bin/env <shname>এই দিনগুলি বহনযোগ্যতার জন্য সম্ভবত ব্যবহার করা আরও ভাল ।
HalosGhost

উত্তর:


15

আরম্ভকারীদের জন্য, আপনি যদি এই ধারণাটি করতে পারেন যে বাশ প্রাক-ইনস্টল করা আছে (যা আপনার তালিকার সমস্ত সিস্টেমে আমার জ্ঞানের বিষয়) তবে সামঞ্জস্যপূর্ণ হওয়ার জন্য নিম্নলিখিত হ্যাশবাংটি ব্যবহার করুন:

#!/usr/bin/env bash

bashএটি কনফিগার হওয়ার জন্য যা ঘটুক তা আহ্বান জানায় , তা এতে থাকুক /binবা না থাকুক /usr/local/bin

বিস্তৃত পরিসীমা জুড়ে বেশিরভাগ সিস্টেমে থাকাকালীন (এআইএক্স, সোলারিস, বেশ কয়েকটি বিএসডি স্বাদ সহ) bashবিভিন্ন স্থানে envশেষ হয়ে সর্বদা শেষ হয় /usr/bin/env। কৌশলটি আমার নয়, বাশ কুকবুকের লেখক।

যাইহোক, হ্যাঁ বাশ আপনাকে এমন কিছু "আধুনিক" বৈশিষ্ট্য ব্যবহার করার অনুমতি দেবে যা আপনার জীবনকে আরও সহজ করে তোলে।

উদাহরণস্বরূপ ডাবল বন্ধনী:

[[ -f "/etc/debian_version" ]] && echo "This is a Debian flavor"

যদিও চিরাচরিত শেল উপভাষায় আপনার কাছে অবলম্বন করতে হবে:

test -f "/etc/debian_version" && echo "This is a Debian flavor"

তবে ডাবল বন্ধনীগুলির মধ্যে সর্বোত্তম হল তারা মেলার জন্য নিয়মিত প্রকাশের অনুমতি দেয় allow ব্যাশ হ্যাকাররা উইকি যে দিক আপনি অনেক ঠাট দেব।

আপনি সিনট্যাক্সের $((2**10))সাথে ইনলাইন করে বেশ সুবিধাজনক এক্সপ্রেশন বা অন্যান্য পাটিগণিতের এক্সপ্রেশনগুলিও ব্যবহার করতে পারেন $((expression))

সাবস্কেলের জন্য ব্যাকটিক্স ব্যবহার করা ভাল, কিছুটা পুরানো হলেও। তবে অনুরোধের বাসা বাঁধার ক্ষমতাগুলি $(command ...)আরও সুবিধাজনক কারণ আপনাকে বিভিন্ন সাব-শেল স্তরে অনেক কিছুই এড়াতে হবে না।

এগুলি কিন্তু কয়েকটি জিনিস যা আপনাকে প্রচলিত সাধারণ পসিক্স shসিনট্যাক্সের সাহায্যে দেয় ।

তবে আপনি যদি শেলটির উপর আরও শক্তি চান (কেবল স্ক্রিপ্টগুলিতে নয়) তবে একবার দেখুন zsh


বাশ একটি খুব দরকারী সরঞ্জাম তবে বাশ স্ক্রিপ্টিং বাগের জন্য যেমন ঝুঁকিপূর্ণ হতে পারে এমন পরিষেবাগুলি শুরু করার জন্য এটি ব্যবহার না করার বিষয়ে সতর্ক থাকুন যেমন অ্যাক্সেস . redhat.com/security/cve/CVE-2014-6271 । এই shধরনের কাজের জন্য দৃ St় থাকুন ।
রিক -777

1
রিক-7777 যে দুর্বলতা যথেষ্ট পরিমাণে নিমজ্জিত ছিল এবং আমার মতে আপনার মন্তব্যটি FUD। যদি কোনও সিস্টেম পরিষেবা বাশের আওতায় চলে তবে তা কোনওভাবেই সেই বাগের পক্ষে ঝুঁকিপূর্ণ নয়। এটি কেবলমাত্র ত্রুটিযুক্ত যদি এটি কোনও ব্যাশ প্রক্রিয়া বন্ধ করে দেয় তবে দূরবর্তী ব্যবহারকারীদের এক বা একাধিক পরিবেশের ভেরিয়েবলগুলিতে সরাসরি অ্যাক্সেসের অনুমতি দেয়, যেমন ফাস্টসিজিআইয়ের মতো, এবং তারপরে কেবল বাশের অনাদায়ী সংস্করণগুলিতে। shলিঙ্কযুক্ত সিস্টেমগুলিতে bash, দুর্বলতা ব্যবহার করে হ্রাস করা হবে না sh
স্কোর_উন্ডারে

11

উবুন্টু এবং ডেবিয়ান সালে /bin/shহয় dashযা POSIX-অনুবর্তী শেল হয়। আপনি যদি নির্দিষ্ট করে থাকেন তবে #!/bin/shআপনাকে অবশ্যই আপনার স্ক্রিপ্টের পসিক্স স্টেটমেন্টের মধ্যে সীমাবদ্ধ রাখতে হবে। (যে সুবিধাটি তার dashচেয়ে দ্রুত শুরু হয় bash, তাই আপনার স্ক্রিপ্টটি কম সময়ে এটির কাজটি সম্পন্ন করতে পারে))

অনেকগুলি (সর্বাধিক?) অন্যান্য লিনাক্স সিস্টেমে, /bin/shতাই এক্সটেনশন ব্যবহার করেও bashঅনেকগুলি স্ক্রিপ্টগুলি #!/bin/shতাদের শেবাং লাইন হিসাবে লেখা হয় bash

আপনি যদি bashএক্সটেনশানগুলি ব্যবহার করতে চান তবে সমস্ত সিস্টেমে সবচেয়ে নিরাপদ পদ্ধতিটি নির্দিষ্ট করা উচিত #!/bin/bash; এইভাবে আপনি আপনার নির্ভরতা স্পষ্টভাবে উল্লেখ করছেন bash। আপনি প্রয়োজন উবুন্টু এবং ডেবিয়ান উপর এই কাজ করতে। একটি যুক্ত বোনাস হিসাবে, যখন /bin/sh bashকিছু এক্সটেনশন ডি-অ্যাক্টিভেট হিসাবে শুরু করা হয় ( বিশদগুলির জন্য পসিক্স মোডের বর্ণনাbash দেখুন); সুতরাং #!/bin/bashএর পূর্ণ সুবিধা পাওয়ার জন্য নির্দিষ্টকরণের প্রয়োজন bash

ওএস এক্সে /bin/bashপাওয়া যায়, এবং /bin/shহয় bash। নির্দিষ্টকরণ #!/bin/bashসেখানে পাশাপাশি কাজ করবে।


5

হ্যাঁ, ওএসএক্স এবং লিনাক্স উভয়ই আসবে /bin/bash। আপনার পুরোপুরি নিরাপদ থাকা উচিত। তবে, এটি পসিক্স নয় । পসিক্স শেলটি /bin/shবেশিরভাগ (সমস্ত?) সিস্টেমে রয়েছে এবং এটি সর্বাধিক বহনযোগ্য পন্থা এবং পসিক্স সুসংগত হওয়ার একমাত্র উপায়।

নোট যে অনেক সিস্টেমে /bin/shপয়েন্ট bashঅন্যান্যের তে এটি বিভিন্ন শাঁস নির্দেশ করতে পারেন। dashউদাহরণস্বরূপ এটি ডেবিয়ান এবং উবুন্টুতে একটি সিমিলিংক । এছাড়াও, এর /bin/shলিঙ্ক bashহলেও শেলের আচরণটি পরিবর্তিত হয় যখন তাকে sh(থেকে man bash, জোর দেওয়া খনি) বলা হয়:

যদি শ নামের সাথে বাশটি প্রেরণ করা হয় তবে এটি পসিক্স স্ট্যান্ডার্ডের সাথে সামঞ্জস্য রেখে যতটা সম্ভব নিবিড়ভাবে ofতিহাসিক সংস্করণের শুরুর আচরণটি নকল করার চেষ্টা করে। যখন একটি আন্তঃসংযোগ টিভ লগইন শেল, বা - লগিন বিকল্প সহ একটি অ-ইন্টারেক্টিভ শেল হিসাবে আহ্বান করা হয়, এটি প্রথমে / etc / প্রোফাইল এবং ~ /। প্রোফাইল থেকে আদেশগুলি পঠন ও সম্পাদন করার চেষ্টা করে। --Noprofile বিকল্পটি এই আচরণটি বাধা দিতে ব্যবহৃত হতে পারে। Sh নামের সাথে একটি ইন্টারেক্টিভ শেল হিসাবে আহ্বান করা হলে, ব্যাশ ভেরিয়েবল ENV সন্ধান করে, যদি এর মানটি প্রসারিত করে
সংজ্ঞায়িত করা হয়, এবং পড়ার এবং সম্পাদনের জন্য ফাইলের নাম হিসাবে প্রসারিত মান ব্যবহার করে। যেহেতু sh হিসাবে আহ্বান করা একটি শেল অন্য কোনও স্টার্টআপ ফাইল থেকে কমান্ডগুলি পড়তে এবং চালিত করার চেষ্টা করে না, --rcfile বিকল্পের কোনও প্রভাব নেই। Sh নামের সাথে যুক্ত একটি অ ইন্টারেক্টিভ শেল অন্য কোনও স্টার্টআপ ফাইল পড়ার চেষ্টা করে না। Sh হিসাবে আহ্বান করা হলে, ব্যাশ স্টার্টআপ ফাইলগুলি পড়ার পরে পিক্সিক্স মোডে প্রবেশ করে।


2

যদি "সমস্ত ইউনিক্স সিস্টেম" এর সাথে সামঞ্জস্যতা নিরঙ্কুশ প্রয়োজন - এবং যদি তা না হয় তবে আপনি কেন শেল স্ক্রিপ্ট লিখছেন? - তবে, হ্যাঁ, আপনার ব্যবহার করা উচিত #! /bin/sh, কারণ বাশকে কোথাও ইনস্টল করার গ্যারান্টি নেই , ভিতরে যেতে দিন /bin

এটি আসলে অনেক বেশি, এর চেয়েও খারাপ। আপনার যদি সমস্ত ইউনিক্স সিস্টেমের সাথে সামঞ্জস্যতা প্রয়োজন , এতে সোলারিস এবং এআইএক্সের মতো জিনিস রয়েছে যা তাদের শেল পরিবেশকে 1995-এর চারপাশে হিমায়িত করেছে Which যার অর্থ আপনাকে পুরানো ফ্যাশন sort +Nসিনট্যাক্সের মতো জিনিসগুলি ব্যবহার করতে হবে - নতুন সিস্টেমগুলি বাদ পড়েছে! এবং এর অর্থ হ'ল কোনও শেল ফাংশন, অ্যারে, না [[ ... ]], না ${foo#glob}, $(( ... ))পাটিগণিতের জন্য নেই , সম্ভবত কোনও $( ... )স্টাইল কমান্ডের প্রতিস্থাপন, কীভাবে বড় ইনপুট পেতে পারে তার উপর ছোট এবং অনিবন্ধিত উপরের সীমা, ...

আপনি সম্ভবত সঙ্গে বিরক্ত না পার পেয়ে যাবে যে অনেক সামঞ্জস্য, কিন্তু যদি এটা প্রথম স্থানে এমনকি একটি সমস্যা, আমি দৃঢ়ভাবে সুপারিশ আপনি একটি ভাষা যা শেল কম ভয়ানক বিবেচনা। মৌলিক পার্ল দোভাষী আরো ব্যাশ চেয়ে প্রাপ্তিসাধ্য হওয়ার সম্ভাবনা।


ধন্যবাদ। যেমনটি বলা হয়েছে "আমার ক্ষেত্রে কেবলমাত্র ওএস 'আমি যত্ন করি উবুন্টু (দেবিয়ান) এবং ওএসএক্স"। এই গত 2 বছরে আমি কেবল 2 টি সিস্টেম ব্যবহার করেছি (এবং আমি তাদের প্রচুর ব্যবহার করি), সুতরাং 'কেন' আমি একটি শেল স্ক্রিপ্ট লিখছি যা কেবল তাদের উপর কাজ করবে। সর্বজনীন স্ক্রিপ্ট এবং এটি যে সীমাবদ্ধতাগুলি উপস্থাপন করবে তার জন্য আমার কোনও প্রয়োজন নেই।
মাইকেল ডুরান্ট

@ মিশেলডুরান্ট সে ক্ষেত্রে আপনার শেল স্ক্রিপ্ট লেখার দরকার নেই এবং হওয়া উচিত নয়। এর পরিবর্তে আপনার আরও ভাল স্ক্রিপ্টিং ভাষার যে কোনও ভাষা ব্যবহার করা উচিত যা যখন আপনার মোট পোর্টেবিলিটির প্রয়োজন হয় না an
zwol
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.