এই স্ক্রিপ্টটি কোনও ফাইল থেকে নয় কেন টার্মিনালে কাজ করে?


19

আমার কাছে এই শেল স্ক্রিপ্টটি একটি ফাইলে সংরক্ষিত আছে: এটি কিছু বেসিক স্ট্রিং প্রতিস্থাপন করে।

#!/bin/sh
html_file=$1
echo "html_file = $html_file"
substr=.pdf
pdf_file="${html_file/.html/.pdf}"
echo "pdf_file = $pdf_file"

আমি যদি কমান্ড লাইনে এটি আটকান তবে এটি ঠিকঠাক কাজ করে:

$ html_file="/home/max/for_pauld/test_no_base64.html"
  echo "html_file = $html_file"
  substr=.pdf
  pdf_file="${html_file/.html/.pdf}"
  echo "pdf_file = $pdf_file"

দেয়

html_file = /home/max/for_pauld/test_no_base64.html
pdf_file = /home/max/for_pauld/test_no_base64.pdf

এটি উপরের প্রতিধ্বনি থেকে আউটপুট - এটি ইচ্ছাকৃতভাবে কাজ করছে।

তবে, আমি যখন স্ক্রিপ্ট কল করি, সাথে with

$ saucer "/home/max/for_pauld/test_no_base64.html"

আমি এই আউটপুট পেতে:

html_file = /home/max/for_pauld/test_no_base64.html
/home/max/bin/saucer: 5: /home/max/bin/saucer: Bad substitution

আমার স্ক্রিপ্টটি বাশ বা অন্য কিছুর ভিন্ন সংস্করণ ব্যবহার করছে? আমার শেবাং লাইনটি বদলাতে হবে?


6
সেই প্যারামিটার সম্প্রসারণটি বাশিজম (ভাল, নন-পসিক্স): আপনার শেবাং পরিবর্তন করুন change
জেসনওয়ারিয়ান

ধন্যবাদ! কাজ করেছে। আমি মনে করি আমি shএবং এর মধ্যে পার্থক্য সম্পর্কে কিছুটা দুর্বল bash। আমি এটি উপর পড়তে হবে। আপনি যদি নিজের মন্তব্যে উত্তরে বিরক্ত করতে পারেন তবে আমি এটিকে সঠিক হিসাবে চিহ্নিত করব।
ম্যাক্স উইলিয়ামস

তার বিস্তারিত উত্তরের জন্য ডিউকে টিক দিয়েছিলেন, তবে যাই হোক ধন্যবাদ thanks
ম্যাক্স উইলিয়ামস

2
@ ম্যাক্সউইলিয়ামস: সংক্ষেপে, sh হ'ল আসল বোর্ন শেল। সমস্ত সুসংগত স্ক্রিপ্টগুলি sh এর জন্য লিখতে হবে। তবে পরবর্তী বহু শেল (উদা: বাশ, বোর্ন অ্যাগেইন শেল) "প্রায় সামঞ্জস্যপূর্ণ" এবং প্রচুর অতিরিক্ত উদ্ভাবনী যোগ করে। যেমন বিকল্প আপনি ব্যবহার করেছেন। আজকাল, আপনি কেবল পসিক্স বৈশিষ্ট্যগুলি ব্যবহার করে বেশ সুরক্ষিত, তবে সচেতন থাকবেন যে বহনযোগ্যতা এমনকি একটি সংকীর্ণ সেট (যেমন, কেবলমাত্র sh) এর উপর নির্ভর করে। সুতরাং সাধারণভাবে: #!/usr/bin/env bashআপনার শেবাং হিসাবে ব্যবহার করুন এবং আপনার ইচ্ছামত পিক্সিকালি সংজ্ঞায়িত বিকল্পগুলি ব্যবহার করুন, তবে বহনযোগ্যতা সতর্কতা সহ। এবং পড়ুন: unix.stackexchange.com/a/48787/27616
অলিভিয়ার ডুলাক

উত্তর:


37

কি শ

sh(বা শেল কমান্ড ল্যাঙ্গুয়েজ) হ'ল পসিক্স স্ট্যান্ডার্ড দ্বারা বর্ণিত একটি প্রোগ্রামিং ভাষা । এটা অনেক বাস্তবায়নের আছে ( ksh88, dash, ...)। bashএকটি বাস্তবায়ন হিসাবে বিবেচনা করা যেতে পারেsh (নীচে দেখুন)।

কারণ shএকটি স্পেসিফিকেশন, বাস্তবায়ন নয়,/bin/sh বেশিরভাগ পসিক্স সিস্টেমে প্রকৃত বাস্তবায়নের একটি সিমিলিংক (বা একটি হার্ড লিঙ্ক)।

বাশ কি?

bashএকটি shসামঞ্জস্যপূর্ণ বাস্তবায়ন হিসাবে শুরু হয়েছে (যদিও এটি কয়েক বছরের মধ্যে পসিক্স মানকে পূর্বাভাস দেয়), কিন্তু সময়ের সাথে সাথে এটি অনেকগুলি এক্সটেনশন অর্জন করেছে। এর মধ্যে অনেকগুলি এক্সটেনশান বৈধ পসিক্স শেল স্ক্রিপ্টগুলির আচরণ পরিবর্তন করতে পারে, তাই নিজেই bashকোনও বৈধ পসিক্স শেল নয়। বরং এটি পসিক্স শেল ভাষার একটি উপভাষা।

bashএকটি --posixস্যুইচ সমর্থন করে , যা এটিকে আরও পসিক্স-অনুবর্তী করে তোলে। এটি POSIX নকল করার চেষ্টা করে যদি এটি হিসাবে ডাকা হয় sh

sh = বাশ?

দীর্ঘকাল ধরে, বেশিরভাগ জিএনইউ / লিনাক্স সিস্টেমগুলিতে /bin/shনির্দেশ করতে ব্যবহৃত হয় /bin/bash। ফলস্বরূপ, দুজনের মধ্যে পার্থক্য উপেক্ষা করা প্রায় নিরাপদ হয়ে গিয়েছিল। তবে সম্প্রতি এটি পরিবর্তন হতে শুরু করে।

সিস্টেমগুলির কয়েকটি জনপ্রিয় উদাহরণ যেখানে /bin/shদেখায় না/bin/bash (এবং/bin/bash উপস্থিতিও নেই) হলেন:

  1. আধুনিক ডেবিয়ান এবং উবুন্টু সিস্টেম, যা সিমিলিংক করে sh থেকে dashডিফল্টরূপে;
  2. ব্যস্তবক্স , যা সাধারণত লিনাক্স সিস্টেম বুট করার সময় অংশ হিসাবে চালিত হয়initramfs । এটি ashশেল বাস্তবায়ন ব্যবহার করে ।
  3. বিএসডি, এবং সাধারণভাবে কোনও নন-লিনাক্স সিস্টেম। ওপেনবিএসডি ব্যবহার করে pdksh, কর্ন শেলের বংশধর। ফ্রিবিএসডি shহ'ল মূল ইউনিক্স বোর্ন শেলের বংশধর। সোলারিসের নিজস্ব রয়েছে shযা দীর্ঘকাল ধরে পসিক্স-অনুগত ছিল না; হায়রলুম প্রকল্প থেকে একটি বিনামূল্যে বাস্তবায়ন পাওয়া যায় implementation

কীভাবে আপনি তা জানতে পারেন /bin/shআপনার সিস্টেমে পয়েন্ট রয়েছে ?

জটিলতাটি হ'ল এটি /bin/shএকটি প্রতীকী লিঙ্ক বা একটি হার্ড লিঙ্ক হতে পারে। যদি এটি একটি প্রতীকী লিঙ্ক হয় তবে এটি সমাধানের একটি পোর্টেবল উপায় হ'ল:

% file -h /bin/sh
/bin/sh: symbolic link to bash

এটি যদি একটি শক্ত লিঙ্ক হয় তবে চেষ্টা করুন

% find -L /bin -samefile /bin/sh
/bin/sh
/bin/bash

প্রকৃতপক্ষে, -Lপতাকাটি প্রতীক এবং হার্ডলিঙ্ক উভয়কেই কভার করে, তবে এই পদ্ধতির অসুবিধাটি হ'ল এটি বহনযোগ্য নয় - জিএনইউ অনুসন্ধান এবং ফ্রিবিএসডি উভয়ই খুঁজে পাওয়া গেলেও পসিক্স বিকল্পটি সমর্থন করার প্রয়োজন হয় না althoughfind-samefile সমর্থন করে ।

শেবাং লাইন

শেষ পর্যন্ত, «শেবাং» লাইনটি লিখে কোনটি ব্যবহার করবেন তা সিদ্ধান্ত নেওয়ার সিদ্ধান্ত আপনার হাতে।

যেমন

#!/bin/sh

ব্যবহার করবে sh(এবং যা কিছু ঘটতে পারে),

#!/bin/bash

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

#!/bin/dash

কোনটি ব্যবহার করতে হবে

আমার নিজের স্ক্রিপ্টগুলির জন্য, আমি shনিম্নলিখিত কারণে পছন্দ করি :

  • এটি মানসম্মত হয়
  • এটি শিখতে অনেক সহজ এবং সহজ
  • এটি পসিক্স সিস্টেমের মধ্যে বহনযোগ্য - এমনকি যদি তাদের না ঘটে তবে bashতাদের থাকা প্রয়োজনsh

bashপাশাপাশি ব্যবহার করার সুবিধা আছে । এর বৈশিষ্ট্যগুলি প্রোগ্রামিংকে আরও সুবিধাজনক এবং অন্যান্য আধুনিক প্রোগ্রামিং ভাষায় প্রোগ্রামিংয়ের অনুরূপ করে তোলে। এর মধ্যে স্কোপড স্থানীয় ভেরিয়েবল এবং অ্যারের মতো জিনিস অন্তর্ভুক্ত রয়েছে। সাদামাটা shএকটি খুব সংক্ষিপ্ত প্রোগ্রামিংয়ের ভাষা।


বিস্তারিত উত্তরের জন্য ধন্যবাদ: আমি লিনাক্স মিন্ট ব্যবহার করি যা ডেবিয়ান-ভিত্তিক এবং /bin/shপ্রকৃতপক্ষে এটির একটি সিমলিংক /bin/dash
ম্যাক্স উইলিয়ামস

আপনি যদি পসিক্স শ মেনে চলতে চান তবে শেবাংকে পুরোপুরি ছেড়ে দিন: শেল কমান্ডের একটি ফাইলের প্রথম লাইন যদি "#!" অক্ষর দিয়ে শুরু হয়, ফলাফলগুলি অনির্ধারিত পাবস.ওপেনগ্রুপ.org/onlinepubs/009695399/ ইউটিলিটি / ...
ড্যানিয়েল জুর

4
@ ড্যানিয়েলজোর যদি কোনও ইউনিক্সের মতো সিস্টেম শ্যাব্যাংগুলির জন্য সাধারণ সমর্থনটি বাদ দেয় তবে এটি এতগুলি বিষয়কে ভেঙে ফেলতে পারে যা ব্যবহারিকভাবে ব্যবহারযোগ্য নয়। সুতরাং এটি একটি ডি ফ্যাক্টো স্ট্যান্ডার্ড, এটি পসিক্সে নির্দিষ্ট না থাকলেও। একমাত্র আসল সামঞ্জস্যের সমস্যা হ'ল দোভাষীদের পথ পৃথক হতে পারে।
বার্মার

23

@ হান্টারের কাছ থেকে দুর্দান্ত উত্তরে যুক্ত করা.এস.হম্পসন আমি উল্লেখ করতে চাই যে স্ক্রিপ্টটির অ-বহনযোগ্য অংশটি হ'ল

pdf_file="${html_file/.html/.pdf}"

${variable/search/replace}একটি গনুহ এক্সটেনশান। তবে আপনি খাঁটি পসিক্স দিয়ে সহজেই এড়াতে পারেন:

pdf_file="${html_file%.html}".pdf

হান্টারকে অনুসরণ করে, এটি শেবাংকে পরিবর্তনের চেয়ে ভাল ফিক্স #! /bin/bash


ধন্যবাদ - আমি একমত যে এটি "খাঁটি" স্থির হয়েছে তবে আমি বরং শেবাং বোঝাই বাশ চাই, কারণ ব্যাশটি আমি টার্মিনালে নিয়মিত ব্যবহার করি (ডিফল্টরূপে) এবং স্ক্রিপ্টগুলি ঠিক নিয়মিত হিসাবে একই জিনিস করা সহজ হয় কমান্ড লাইন
ম্যাক্স উইলিয়ামস

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