.Bla.sh বনাম সহ স্ক্রিপ্ট কল করা। bla.sh


11

নীচে নীচে দুটি উদাহরণ ক) এবং খ) তে শেলটি কী করে তা আমাকে কেউ ব্যাখ্যা করতে পারেন? এটি স্পষ্টতই অন্যরকম আচরণ করে, তবে কেন আউটপুট আলাদা তা আমি খুঁজে পাই না।

উদাহরণ:
আসুন আমাদের বর্তমান ডিরেক্টরিতে একটি স্ক্রিপ্ট আছে যার নাম দেওয়া bla.shহয়েছে কেবলমাত্র একটি কমান্ড সহ:
echo ${0##/*} hello

ক)
হিসাবে শুরু: ./bla.sh
দেয়:./bla.sh hello

খ)
হিসাবে শুরু: . bla.sh
দেয়:-bash hello

যেহেতু আমি এটি কোনও স্ক্রিপ্টে ব্যবহার করি, তাই দ্বিতীয় আউটপুট (-বাশের সামনে "-" বলে) কমান্ডটি হত্যা করে। অবশ্যই, সাহায্যের --আগে একটি সহজ ${...}, তবে আমি বুঝতে আগ্রহী যে প্রথম স্থানে আউটপুট কী কারণে ঘটে।
আমি বাশ ভালবাসি। এবং ভি [মি]। কিন্তু আমার দ্বিমত আছে…

উত্তর:


22
./bla.sh

এখানে কমান্ডটি দেওয়া আছে ./bla.sh। এটি শেলটি bla.shবর্তমান ডিরেক্টরিতে চালিত এক্সিকিউটেবলের সন্ধান করে , তারপরে শেল থেকে আলাদা প্রক্রিয়াতে কার্নেলটিকে এটি একটি সাধারণ প্রোগ্রাম হিসাবে চালাতে বলে। (এটা কোন ব্যাপার না যদি bla.shএকটি হয় bashস্ক্রিপ্ট, একটি perlবা pythonএক, অথবা একটি কম্পাইল করা বাইনারি।)


. bla.sh

এখানে, কমান্ডটি হ'ল .(ওরফে source), আপনার শেলের একটি অন্তর্নির্মিত কমান্ড। এটি bla.shশেলটিকে সিস্টেম পাথ ($ PATH) নামক কোনও ফাইল সন্ধান করে এবং বিষয়বস্তুগুলি এমনভাবে ব্যাখ্যা করে যেন সেগুলি আপনার দ্বারা টাইপ করা হয়েছিল; এগুলি সমস্ত শেল নিজেই একই প্রক্রিয়াতে সম্পন্ন হয় (এবং সুতরাং শেলের অভ্যন্তরীণ অবস্থাকে প্রভাবিত করতে পারে)।

এটি অবশ্যই তখন কাজ করে যখন শেলের bla.shজন্য কমান্ড থাকে bash(যদি আপনি বর্তমানে এটি ব্যবহার করেন তবে) এটি perlস্ক্রিপ্ট বা অন্য কোনও কিছুর জন্য কাজ করবে না ।

( এটিও help .এবং এর help sourceমধ্যেও ব্যাখ্যা করা হয়েছে ))


যেমন .এবং ./সম্পূর্ণ আলাদা জিনিস (একটি কমান্ড বনাম কোনও পাথের অংশ), সেগুলি একত্রিত করা যেতে পারে, অবশ্যই - বর্তমান ডিরেক্টরিতে . ./bla.shকোনও ফাইল "উত্স" ব্যবহার করে bla.sh


সাধারণত ./bla.shপদ্ধতিটি ব্যবহার করা ভাল । শুধু ~/.bashrc, ~/.profileএবং এই ধরনের ফাইল সাধারণত sourced কারণ তারা বর্তমান পরিবেশ পরিবর্তন করার অনুমিত হয়।


3
তদতিরিক্ত, যদি আপনি ব্লেশ পরিবেশে বাশ পরিবেশ পরিবর্তন করেন তবে এই পরিবর্তনগুলি পরে বিবেচনায় নেওয়া হবে। bla.sh তবে ./bla.sh এর পরে নয়। এই কারণ . bla.sh বর্তমান বাশের প্রেক্ষাপটে চালিত হয় যেখানে .bla.sh একটি সাবপ্রসেস হিসাবে চালায়।
mouviciel

1
কিছু উদাহরণের জন্য mywiki.wooledge.org/BashFAQ/060 দেখুন । দ্রষ্টব্য যে sourceএটি বাশ ওরফে ., বিপরীতে sourceনয় এবং অন্যান্য শেলগুলিতে কাজ করবে না।
মুর্চি

7

./<cmd><cmd>নতুন ডিরেক্টরি (কাঁটাচামচ) প্রক্রিয়াতে বর্তমান ডিরেক্টরিতে থাকা প্রোগ্রামটি কার্যকর করবে । এটি কার্যকর করতে হবে। এবং এটি পঠনযোগ্য এটি দিয়ে শুরু হয় #!

. <cmd>আপনার বর্তমান শেলটি বর্তমান শেল প্রক্রিয়াতে <cmd>আপনার $PATHবা বর্তমান ডিরেক্টরিতে থাকা শেল স্ক্রিপ্টটি কার্যকর করতে সক্ষম করে। এটি পাঠযোগ্য হতে হবে। এটি শেল কমান্ডের একটি উপনাম ।source


-1 . <cmd>প্রোগ্রামটি সন্ধান করবে $PATHএবং যদি এটি না পাওয়া যায় তবে এটি বর্তমান ডিরেক্টরিতে সন্ধান করবে।
ডগবনে

@ ডগবেন ঠিক আছে, আমি এটি সংশোধন করেছি।
কিমিপ্যাপ্লান

এফডাব্লুআইডাব্লু, সমস্ত শেল সিডব্লিউডি সর্দাগুলি স্ক্রিপ্টগুলির জন্য অনুসন্ধান করবে না। zsh (কমপক্ষে আমার কাছে থাকা কনফিগারেশনের সাথে) প্রয়োজন. ./cmd
bstpierre

1
@bstpierre এটিকে একটি চলমান স্থল বলে মনে হচ্ছে। আমি যে পসিএক্স রেফারেন্সটি দিয়েছি তা বলেছে যে "শেলটি PATH দ্বারা নির্দিষ্ট অনুসন্ধানের পথটি ব্যবহার করবে" এবং "কিছু পুরানো প্রয়োগগুলি ফাইলের জন্য বর্তমান ডিরেক্টরিটি অনুসন্ধান করেছিল, এমনকি প্যাথএইচটির মানটি এটি অনুমোদিত না হলেও"।
কিমিপ্যাপ্লান

1

./cmd./এক্সিকিউটেবলের জন্য সুস্পষ্ট পথ ( - বর্তমান দির) ব্যবহার করে। এবং এটি দিয়ে এটি শুরু হওয়া প্রয়োজন নয় #!

. cmd- (ওরফে source) - বশ বিল্টিন কমান্ড। এর মাধ্যমে কার্যকর করার একটি দৃশ্যমান পার্থক্য sourceহ'ল এটি বর্তমান শেলের পরিবেশ পরিবর্তনশীল সেট / সংশোধন করতে পারে।


আরও সুনির্দিষ্টভাবে বলা যায়, sourceকেবলমাত্র ব্যাশ-কেবলমাত্র একটি উপনাম .(যা আদর্শ)
ব্যবহারকারী 01686

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