স্ক্রিপ্টটি তার শেবাং লাইন অনুযায়ী চালানোর জন্য কোনও আদেশ আছে কি?


46

যদি আমি কোনও বাশ স্ক্রিপ্ট সম্পাদন করতে চাই যেখানে এর কার্য সম্পাদনের অনুমতি সেট নেই তবে আমি এটি করতে পারি:

bash script.sh

bashস্ক্রিপ্টটি সম্পাদনযোগ্য না হয়ে এবং আমি সঠিক দোভাষী না জানলে এর পরিবর্তে আমার কী ব্যবহার করা উচিত ? এমন কোন আদেশ আছে যা শেবাং লাইন থেকে দোভাষীর সন্ধান করে এবং এটি দিয়ে স্ক্রিপ্টটি কার্যকর করে?


বুদ্ধি বাশ কি ভুল?
স্টিফেন

@ স্টেফেন আপনি কীভাবে জানেন যে ফাইলটি ব্যাশ স্ক্রিপ্ট?
মুড়ু

@ এমুরু প্রশ্ন থেকে উদ্ধৃতি দিয়েছেন: "আমি যদি বাশ স্ক্রিপ্টটি চালাতে চাই ..." তদ্ব্যতীত (এটি কোনও বাশ স্ক্রিপ্ট না হলেও), যদি bash whateverকাজ করে তবে কেন কিছু আলাদা ব্যবহার করবেন? ভার্চুয়ালি প্রতিটি *
আইএক্স

1
@ স্টেফেন আপনি বাকি প্রশ্নটি পড়েছেন? তারা বলে: "যদি ... তবে আমি এটি করতে পারি: ..." এবং "বাশের পরিবর্তে আমার কী ব্যবহার করা উচিত ... যদি আমি সঠিক দোভাষীটি না জানি ?"
মুড়ু

@ মুরু: সম্ভবত আমি সুস্পষ্ট দেখতে পাচ্ছি না। তবে যদি ফাইলটি / হ্যাস / একটি শেবাং লাইন, যেমন প্রশ্নে বলা হয়েছে, বাশ ঠিক কী করবে তার জন্য জিজ্ঞাসা করা হবে। হিসাবে নীচে উত্তর অনুযায়ী perl হবে। তাহলে বাশ ব্যবহার না করে কী লাভ?
স্টেফেন

উত্তর:


67

হাঁ। একে বলা হয় perl:

perl foo.bash    # works
perl foo.lua     # works
perl foo.clisp   # works
perl foo.csh     # works
perl foo.php     # works
perl foo.gnuplot # works (no arguments)
perl foo.pl      # works (obviously)
perl foo.py      # works
perl foo.sh      # works
perl foo.tcl     # works
perl foo.rb      # works
perl foo.nodejs  # works
perl foo.r       # works
perl foo.oct     # works
perl foo.csharp  # works (no arguments)

পার্লের ডকুমেন্টেশনে এটি উল্লেখ করা হয়েছে :

যদি #!রেখায় "পার্ল" শব্দ বা "ইন্দির" শব্দটি না থাকে #!তবে পার্ল দোভাষী পরিবর্তে প্রোগ্রামটির নামকরণ করা হয় । এটি সামান্য উদ্ভট, তবে এটি এমন মেশিনে লোকদের সহায়তা করে যা না করে #!, কারণ তারা কোনও প্রোগ্রাম বলতে পারে যে তাদের শেলটি / ইউএসআর / বিন / পার্ল, এবং পার্ল তারপরে প্রোগ্রামটি তাদের জন্য সঠিক দোভাষীর কাছে প্রেরণ করবে।


40
ঠিক আছে, এটা ঠিক নোংরা।
পাতলা

1
ফাইল এক্সটেনশন .jsকাজ করে?
পাইসিস

1
এছাড়াও, মেশিনগুলি কি করে না #!। আমি এখন কয়েক থেকে আরও বেশি মনে করি, এবং এই সমস্যাটি আমি অনুভব করি না।
পাইসিস

1
ঠিক আছে, এটি আপনার উদাহরণটি ফাইলগুলি থেকে বেশ কয়েকটি শেবাং লাইন প্রদর্শন করার পরিবর্তে প্রচুর ফাইল এক্সটেনশানগুলি হাইলাইট করেছে বলে মনে হয়েছিল এবং আমি অনুমান করি যে এর পূর্বাভাসটি কীভাবে কাজ করেছিল।
পাইসিস

2
আমি পছন্দ করি কীভাবে man perlrunমেষশাবক স্বীকার করেন যে এটি "সামান্য উদ্ভট" :) :)। আমি মনে করি এটি ইউনিক্স-এর পরিবেশবিহীন পরিবেশ এবং ইউএনআইএক্সের খুব পুরানো সংস্করণকে লক্ষ্য করে একটি কৌতূহল হিসাবে বিবেচনা করা উচিত ।
পাতলা

25

স্ক্রিপ্টগুলি অগত্যা একটি শেবাং থাকে না

স্ক্রিপ্ট ব্যাখ্যাকারী থেকে চালানো হয়েছে, তবে আপনি নিশ্চিত করুন যে এটি কুঁড়েঘর হয়েছে হতে পারে না এ সব । কোডটি চালানোর জন্য দোভাষীকে ফোন করলে , দোভাষী থেকে চালিত স্ক্রিপ্টগুলির শেবাং প্রয়োজন হয় না

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

সংক্ষেপে নিয়ম:

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

স্ক্রিপ্টের তবে শেবাং না থাকলে, কোন দোভাষী ব্যবহার করবেন তা জানানোর জন্য স্ক্রিপ্টের অভ্যন্তরে কোনও (প্রত্যক্ষ *) তথ্য নেই।

বলেছে

আপনি অবশ্যই সবসময় একটি মোড়কের স্ক্রিপ্ট লিখতে পারে চেষ্টা যদি স্ক্রিপ্ট কুঁড়েঘর হয়েছে পাওয়া ব্যাখ্যাকারী থেকে এটি চালানোর খুঁজে বের করতে এবং তা থেকে অনুবাদক পড়া, পরবর্তীকালে।

একটি উদাহরণ

#!/usr/bin/env python3
import subprocess
import sys

args = sys.argv[1:]; script = args[0]

try:
    lang = open(script).readlines()[0].replace("#!", "").strip().split()[-1]
    cmd = [lang, script]+args[1:]
    subprocess.call(cmd)
except (PermissionError, FileNotFoundError, IndexError):
    print("No valid shebang found")
  • এটা সংরক্ষণ tryrunমধ্যে $PATH(যেমন ~/bin, এটা করতে, ডিরেক্টরির যদি না বিদ্যমান, লগ আউট করে আবার পারে তা নিশ্চিত) এক্সিকিউটেবল । তারপরে চলছে:

    tryrun /path/to/nonexecutablescript

    আমার অ-এক্সিকিউটেবল pythonএবং bashস্ক্রিপ্টগুলিতে সঠিক দোভাষীকে (পরীক্ষিত) কল করুন ।

ব্যাখ্যা

  • স্ক্রিপ্টটি কেবল স্ক্রিপ্টের প্রথম লাইনটি পড়ে, অপসারণ করে #!এবং বাকীটি দোভাষীকে কল করতে ব্যবহার করে।
  • যদি এটি কোনও বৈধ দোভাষীকে কল করতে ব্যর্থ হয় তবে এটি একটি PermissionErrorবা একটি বাড়াবে FileNotFoundError

বিঃদ্রঃ

এক্সটেনশন ( .sh, .pyইত্যাদি) লিনাক্স এর জন্য উপযুক্ত অনুবাদক নির্ধারণে কোনো ভূমিকা সবটা পালন করে।


(* কোড থেকে বাক্য গঠন নির্ধারণের জন্য অবশ্যই একটি "স্মার্ট" অনুমান-অ্যালগরিদম বিকাশ করা সম্ভব))


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

@ আইভর শিবাংটি বের করার বিষয়টি ইস্যু নয়, তবে এটি ছাড়া কোড চালানো পুরোপুরি সম্ভব।
জ্যাকব ভিলিজম

@ আইভর আহ, আমি কী বলতে চাইছি তা দেখছি। যদি স্ক্রিপ্টটি কার্যকর হয় এবং কমান্ডে ভাষা ছাড়াই চালানো হয়, স্ক্রিপ্টটি দোভাষীকে ডাকে, অন্যভাবে নয়।
জ্যাকব ভিলিজম

1
@ জ্যাকবভিলিজম আমি "স্ক্রিপ্টটি দোভাষীকে কল করে" বলব না, আরও "লিপিটি কার্নেল স্ক্রিপ্টটি সম্পাদন করার সময় কোন দোভাষীকে ফোন করতে পারে তা নির্ধারণের জন্য শেবাং লাইন নেয়"।
পাওলো ইবারম্যান

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

6

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

#!/bin/bash

copy=/tmp/runner.$$
cp $1 ${copy}
chmod u+x ${copy}
${copy}
rm ${copy}

এভাবে:

$ echo "echo hello" > myscript
$ ./myscript
bash: ./myscript: Permission denied
$ ./runscript myscript 
hello

আমি এটি করার বিরুদ্ধে সুপারিশ করছি। অনুমতিগুলি একটি কারণে রয়েছে। অনুমতিগুলি বিভক্ত করার জন্য এটি একটি প্রোগ্রাম।

মনে রাখবেন শেবাং হ্যান্ডলিং একটি কার্নেল ফাংশন (লিনাক্স উত্স কোডে fs/binfmt_script.c)। মৌলিকভাবে একটি স্ক্রিপ্ট চাওয়ার প্রক্রিয়া সরাসরি সম্পর্কে জানতে পারে না #!- কার্নেল এটির সাহায্যে এটি ব্যবহার করে যে এটি একটি অনুবাদক চালু করতে পারে।


2
আমি সবসময় ধরে নিয়েছিলাম যে এটি শেলের একটি ফাংশন, কার্নেল নয়। আজ নতুন কিছু শিখেছি।
বোটকোডার

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