ইউনিক্স কনসোল বা ম্যাক টার্মিনালে কীভাবে শেল স্ক্রিপ্ট চালানো যায়?


506

আমি এটি জানি, এটি ভুলে যান এবং আবার এটিকে পুনরায় জ্ঞাত করুন। এটা লিখে সময়।


15
খ্যাতি স্টেশনে
পুরোপুরি আপভোট

আপনি যে দুর্দান্ত ভয়ঙ্কর ত্রুটি পেয়েছিলেন কেবল সেটির প্রশংসা করতে হবে না!
বিআরএইচএসএম

উত্তর:


941

একটি নির্বাহযোগ্য shস্ক্রিপ্ট চালাতে , ব্যবহার করুন:

sh myscript

একটি নির্বাহযোগ্য bashস্ক্রিপ্ট চালাতে , ব্যবহার করুন:

bash myscript

এক্সিকিউটেবল (যা এক্সিকিউটেবল অনুমতি সহ কোনও ফাইল) শুরু করতে; আপনি কেবল এটির পথ দ্বারা নির্দিষ্ট করেছেন:

/foo/bar
/bin/bar
./bar

একটি স্ক্রিপ্ট কার্যকর কার্যকর করতে, এটি প্রয়োজনীয় অনুমতি দিন:

chmod +x bar
./bar

যখন কোনও ফাইল নির্বাহযোগ্য হয় তখন কার্নেলটি এটি সম্পাদন করার পদ্ধতি নির্ধারণের জন্য দায়বদ্ধ। নন-বাইনারিগুলির জন্য, এটি ফাইলের প্রথম লাইনটি দেখে। এটিতে একটি থাকা উচিত hashbang:

#! /usr/bin/env bash

হ্যাশব্যাং কার্নেলকে জানায় যে কোন প্রোগ্রামটি চালানো উচিত (এই ক্ষেত্রে কমান্ডটি /usr/bin/envযুক্তি দিয়ে চালানো হয় bash)। তারপরে, স্ক্রিপ্টটি পরবর্তী আর্গুমেন্ট হিসাবে আপনি সমস্ত আর্গুমেন্ট হিসাবে স্ক্রিপ্টটি দিয়েছিলেন (দ্বিতীয় তর্ক হিসাবে) to

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

একটি নোট অন /usr/bin/env

সর্বাধিক সাধারণভাবে আপনি হ্যাশ bangs দেখতে পাবেন:

#!/bin/bash

ফলস্বরূপ যে কার্নেল /bin/bashস্ক্রিপ্টটি ব্যাখ্যা করার জন্য প্রোগ্রামটি চালাবে । দুর্ভাগ্যক্রমে, bashসর্বদা ডিফল্টরূপে প্রেরণ করা হয় না এবং এটি সর্বদা পাওয়া যায় না /bin। যদিও লিনাক্স মেশিনে এটা সাধারণত তাই হয়, সেখানে অন্যান্য POSIX মেশিন যেখানে একটি সীমার হয় bashযেমন বিভিন্ন অবস্থানগুলি, জাহাজ /usr/xpg/bin/bashবা /usr/local/bin/bash

একটি পোর্টেবল বাশ স্ক্রিপ্ট লিখতে, আমরা তাই bashপ্রোগ্রামের অবস্থানের হার্ড-কোডিংয়ের উপর নির্ভর করতে পারি না । POSIX ইতিমধ্যে যে মোকাবেলার জন্য একটি প্রক্রিয়া আছে: PATH। ধারণাটি হ'ল আপনি আপনার প্রোগ্রামগুলি যে কোনও একটি ডিরেক্টরিতে ইনস্টল করেছেন PATHএবং আপনার নামটি চালাতে চাইলে সিস্টেমটি আপনার প্রোগ্রামটি সন্ধান করতে সক্ষম হবে।

দুঃখের বিষয়, আপনি কেবল এটি করতে পারবেন না :

#!bash

কার্নেলটি আপনার জন্য কোনও PATHঅনুসন্ধান করবে না । এমন একটি প্রোগ্রাম রয়েছে যা PATHআপনাকে অনুসন্ধান করতে পারে, যদিও এটি বলা হয় env। ভাগ্যক্রমে, প্রায় সমস্ত সিস্টেমে একটি envপ্রোগ্রাম ইনস্টল করা আছে /usr/bin। সুতরাং আমরা envএকটি হার্ডকোডযুক্ত পথটি ব্যবহার শুরু করি যা এরপরে PATHঅনুসন্ধান করে bashএটি চালায় যাতে এটি আপনার স্ক্রিপ্টটির ব্যাখ্যা করতে পারে:

#!/usr/bin/env bash

এই পদ্ধতির একটি খারাপ দিক রয়েছে: পসিক্সের মতে, হ্যাশব্যাংয়ের একটি যুক্তি থাকতে পারে । এই ক্ষেত্রে, আমরা প্রোগ্রামটির bashযুক্তি হিসাবে ব্যবহার করি env। এর মানে হল যে আমাদের পক্ষে যুক্তি দেওয়ার পক্ষে কোনও স্থান নেই bash। সুতরাং #!/bin/bash -exuএই স্কিম মত কিছু রূপান্তর করার কোন উপায় নেই । আপনি করা হবে set -exuhashbang পর পরিবর্তে।

এই পদ্ধতির আরও একটি সুবিধা রয়েছে: কিছু সিস্টেম একটি দিয়ে জাহাজ চালাতে পারে /bin/bash, তবে ব্যবহারকারী এটি পছন্দ করতে পারে না, এটি বাগি বা পুরানো খুঁজে পেতে পারে এবং bashঅন্য কোনও জায়গায় তার নিজস্ব ইনস্টল করে থাকতে পারে । এটি প্রায়শই ওএস এক্স (ম্যাকস) এর ক্ষেত্রে দেখা যায় যেখানে অ্যাপল পুরানো একটি জাহাজ পাঠায় /bin/bashএবং ব্যবহারকারীরা /usr/local/bin/bashহোমব্রিউয়ের মতো কিছু ব্যবহার করে একটি আপ টু ডেট ইনস্টল করে। আপনি যখন অনুসন্ধানটি envকরে এমন পদ্ধতির ব্যবহার করেন PATH, আপনি ব্যবহারকারীর পছন্দটিকে বিবেচনায় রাখেন এবং তার সিস্টেমটি যেটি প্রেরণ করেছেন তার উপর তার পছন্দের ব্যাশ ব্যবহার করুন।


66
একটি সাধারণ প্রশ্নের ভাল উত্তর লেখার জন্য সময় দেওয়ার জন্য আপনাকে ধন্যবাদ।
পিএ

5
আমি যদি zshআমার শেল হিসাবে ব্যবহার করি তবে আমি কি এটি ব্যবহার করব hashbang #! /usr/bin/env zsh?
স্টেফমিখাইল

6
@ স্টেফমিখাইল: আপনি স্ক্রিপ্টটি আহ্বান করতে কোন শেল ইন্টারপ্রেটার ব্যবহার করেন তা বিবেচনা করে না , স্ক্রিপ্টের ভিতরে#! /usr/bin/env zsh কোডটি যদি জেড শেল দ্বারা কার্যকর করা হয় তবে আপনার ব্যবহার করা উচিত।
জনসিওয়েব

1
ব্যাখ্যার জন্য +1। আমি ভুলে যেতে চাইছি কিন্তু কমান্ডটির অর্থ জেনে রাখা আমাকে পুনরায় প্রত্যাহার করতে সহায়তা করবে।
অ্যাঞ্জলিন নাদের 14

2
@ কার্পেটসমোকার এটি সঠিক, এবং এটি হ্যাশবাংয়ের মধ্যে সীমাবদ্ধ নয়। ব্যাশ স্ক্রিপ্টগুলিতে সর্বদা ইউনিক্স লাইন এন্ডিং ব্যবহার করা উচিত অন্যথায় প্রতিটি কমান্ডের শেষ যুক্তিটিতে it r যুক্ত হবে, ঠিক যেমন হ্যাশবাং কমান্ডের নাম হবে।
lhunath

80

শেল-স্ক্রিপ্ট 'file.sh' শুরু করতে:

sh file.sh

bash file.sh

আর একটি বিকল্প chmod কমান্ড ব্যবহার করে নির্বাহযোগ্য অনুমতি সেট করা হয়:

chmod +x file.sh

এখন .sh ফাইলটি নিম্নরূপে চালান:

./file.sh

15

বোর্ন শেল জন্য:

sh myscript.sh

ব্যাশের জন্য:

bash myscript.sh

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

10

আপনি যদি বর্তমান শেলটিতে স্ক্রিপ্টটি চলতে চান (যেমন আপনি এটি আপনার ডিরেক্টরি বা পরিবেশকে প্রভাবিত করতে চান) আপনার উচিত:

. /path/to/script.sh

অথবা

source /path/to/script.sh

লক্ষ্য করুন /path/to/script.shআপেক্ষিক হতে পারে, উদাহরণস্বরূপ . bin/script.shরান script.shমধ্যে binবর্তমান ডিরেক্টরী অধীনে ডিরেক্টরি।


7
সম্পর্কিত সুনামের সাথে সোর্সিং বা ডট করার সময় খুব সাবধান হন। আপনার সর্বদা এগুলি দিয়ে শুরু করা উচিত If অপব্যবহারের জন্য খুব বিপজ্জনক।
lhunath

0

প্রথমে মৃত্যুদণ্ড কার্যকর করার অনুমতি দিন:
chmod +x script_name

  1. স্ক্রিপ্ট কার্যকর না হলে: -
    sh স্ক্রিপ্ট ফাইল
    sh script_name
    চালানোর জন্য : - বাশ স্ক্রিপ্ট ফাইল চালানোর জন্য: -
    bash script_name
  2. স্ক্রিপ্ট কার্যকর হলে: -
    ./script_name

দ্রষ্টব্য : -আপনি 'ls -a' ব্যবহার করে ফাইলটি নির্বাহযোগ্য কিনা তা পরীক্ষা করতে পারবেন


0

ফাইল এক্সটেনশন। কম্যান্ডটি টার্মিনাল.এপকে দেওয়া হয়েছে। যে কোনও .কমন্ড ফাইলের উপর ডাবল ক্লিক করলে তা কার্যকর হবে।


0

সামান্য সংযোজন, একই ফোল্ডার থেকে একটি অনুবাদক চালাতে, স্ক্রিপ্টগুলিতে এখনও #! হ্যাশবাং ব্যবহার করে ।

উদাহরণস্বরূপ, একটি পিএইচপি 7.2 এক্সিকিউটেবল / ইউএসআর / বিন থেকে অনুলিপি করা হ্যালো স্ক্রিপ্টের সাথে একটি ফোল্ডারে রয়েছে ।

#!./php7.2
<?php

echo "Hello!"; 

এটি চালানোর জন্য:

./hello

যা ঠিক তেমন সমান আচরণ করে:

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