+ X এবং ./ <script> এবং sh ./ <script> এর মধ্যে পার্থক্য


13

স্ক্রিপ্ট চালানোর মধ্যে কোনও বাস্তব পার্থক্য আছে কি?

[sudo] sh ./<script>.run

পরিবর্তে

[sudo] chmod +x ./<script>.run
[sudo] ./<script>.run

উত্তর:


18

আপনি যদি ব্যবহার

sh ./<script>.run

/bin/sh(সাধারণত একটি বোর্ন শেল) স্ক্রিপ্টটি চালাতে ব্যবহৃত হত। অবশ্যই এটি কেবল তখনই কাজ করে যদি স্ক্রিপ্টটি বোর্ন শেলের জন্য লেখা থাকে। কখনও কখনও লিনাক্সের শেল স্ক্রিপ্টগুলিতে বোর্ন শেলের পরিবর্তে বাশের প্রয়োজন হয়, সুতরাং এটি শেল স্ক্রিপ্ট হলেও এটি কাজ করতে পারে না।

আপনি যদি ব্যবহার

./<script>.run

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

সুতরাং এটি সাধারণত স্ক্রিপ্ট চালানোর জন্য পছন্দসই উপায়।


1
যেমন আমি ওলিসের উত্তরে বলেছিলাম: আমি এক্সিকিউটেবলকে পরীক্ষা করেছিলাম আমি শেবাংটি তার / বিন / এস চালিয়েছি তাই এটি সম্ভবত সুক্ষ্ম, অসুস্থ অপেক্ষা করুন এবং দেখুন কারও অন্য কোনও তথ্য আছে কিনা এবং তারপরে একটি উত্তর গ্রহণ করুন
user36976

7

যতক্ষণ না এটি একটি sh(ড্যাশ, বা সমমানের) শেল স্ক্রিপ্ট, না, বাহ্যিক কোনও পার্থক্য নেই।

সমস্যাটি হ'ল .runগ্যারান্টি দেয় না। এটি বাইনারি হতে পারে। এটি বাশ বা পাইথন বা পিএইচপি বা যা কিছু হতে পারে; তাদের সবার শেলের স্ক্রিপ্ট হ্যাশ-ব্যাং রয়েছে। যদি আপনি এটিকে অন্ধভাবে চাপিয়ে দেন তবে shকে কী হতে পারে তা জানে। এটি সম্ভবত ত্রুটিযুক্ত হয়ে যাবে তবে এটি দুর্ঘটনাক্রমে ক্ষতিকারক কোডটি চালানো যেতে পারে।

দ্বারা chmodটিং এটা (সঞ্চালনের অনুমতি বিট সক্রিয় করতে) এবং তারপর চলমান ./script.run, আপনি এটি চলমান সম্ভাব্য সর্বোত্তম সম্ভাবনা দেব। যদি এটি একটি শেল স্ক্রিপ্ট হয় তবে এর হ্যাশ-ব্যাং সঠিকভাবে পার্স হবে এবং এটি যদি বাইনারি কার্যকর হয় তবে এটি কেবল নেটিভভাবে চালানো হবে।


আহ জানতেন না যে উত্তরের জন্য ধন্যবাদ, কেবল এক্সিকিউটেবলের জন্য পরীক্ষা করেছি আমি হ্যাশ-ব্যাং চালাচ্ছি / বিন / শ যাতে আমি এটির সূক্ষ্ম মনে করি
user36976

1

দুটি পদ্ধতি প্রায়শই একই আচরণ করতে পারে তবে খুব আলাদা different

sh ./scriptshএকটি আর্গুমেন্ট দিয়ে কমান্ডটি চালায় ./script, যা প্রদত্ত স্ক্রিপ্টটি কার্যকর করতে ঘটে .. এমনকি স্ক্রিপ্টটি আসলে shস্ক্রিপ্ট না হলেও (খারাপ)

./scriptপ্রদত্ত ফাইলটি কার্যকর করে। এটি "শেবাং" লাইনটি অনুসন্ধান করে কোন আদেশটি চালাবে তা নির্ধারণ করার জন্য এটি করে । যদি অনির্ধারিত থাকে তবে এটি ব্যবহার করে sh( এটি কখনও কখনও দুটি পদ্ধতি একই কাজ করে) তবে প্রায়শই আলাদা দোভাষী বর্ণনা করা হয় ..

উদাহরণস্বরূপ, যদি filenameনিম্নলিখিতগুলি থাকে:

#!/usr/bin/python

print "This is a Python script!"

.. তারপর দুটি কমান্ড খুব আলাদা:

$ sh script
script: line 3: print: command not found
$ chmod +x script
$ ./script
This is a Python script!

যদি শেবাং লাইন না থাকে তবে দুটি একই:

$ cat script
echo "This is an sh script"
$ sh ./script
This is an sh script
$ ./script
This is an sh script

1

একটি গুরুত্বপূর্ণ পার্থক্য হ'ল যদি আপনার হ্যাশবাং লাইনের প্যারামিটার থাকে। উদাহরণস্বরূপ, যদি স্ক্রিপ্টটি শুরু হয়

#!/bin/bash -e

... এবং আপনি এটি বাহ্যিকভাবে ব্যবহার করে চালান shবা bash, সেই লাইনটি একটি মন্তব্য হিসাবে ব্যাখ্যা করা হবে এবং উপেক্ষা করা হবে, সুতরাং -eপ্যারামিটার (ব্যর্থতার প্রস্থান) প্রক্রিয়া করা হবে না। সুতরাং, নিম্নলিখিত স্ক্রিপ্ট দেওয়া:

#!/bin/bash -e
echo Hello
false
echo goodbye

এর জন্য আউটপুটটি ./scriptকেবল "হ্যালো" হবে, তবে এর ফলাফল আউটপুট অনুসরণ sh scriptকরবে যা সম্ভবত উদ্দেশ্য ছিল না।Hellogoodbye

এটি, set -eযাইহোক , কেন আপনাকে সর্বদা পৃথক বিবৃতি ব্যবহার করা উচিত (এটি যাইহোক একটি ভাল ধারণা - প্রায়শই না, যদি মিড-স্ক্রিপ্টের সমস্যা হয় তবে আপনি এটি উপেক্ষা করবেন না)।


0

না

[sudo] chmod +x ./<scrupt>.runস্ক্রিপ্টটি সম্পাদনযোগ্য করে তোলে যাতে আপনি এটি দিয়ে চালাতে পারেন ./<script>.run
সঙ্গে [sudo] sh ./<script>.runআপনি এটা করতে পারবেন, যদিও তা এক্সিকিউটেবল নয়।

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