বর্তমান শেল ছাড়া স্ক্রিপ্ট চালান। কমান্ড আগে


26

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

   . ./somescript.sh

প্রতিবার বিন্দু টাইপ না করে এটি করার কোনও উপায় আছে কি? উদাহরণস্বরূপ স্ক্রিপ্ট থেকে প্যারেন্ট শেলের পরিবর্তনের জন্য একটি আদেশ?

উত্তর:


22

আপনি যা চান ঠিক তেমনটি নাও হতে পারে তবে আপনি করতে পারেন:

alias somescript.sh='. ./somescript.sh'

2
এটি আমার সমস্যাটিকে পুরোপুরি সমাধান করেছে solved ধন্যবাদ!
alu

8

প্রতিবার বিন্দু টাইপ না করে এটি করার কোনও উপায় আছে কি? উদাহরণস্বরূপ স্ক্রিপ্ট থেকে প্যারেন্ট শেলের পরিবর্তনের জন্য একটি আদেশ?

আমি মনে করি না (টাইপিং বাদে source somescript.sh, তবে সম্ভবত আপনি যা খুঁজছেন তা নয়)।

আপনি যদি স্ক্রিপ্টটি যথারীতি চালনা করেন ./somescript.shতবে শেলটি এই আদেশটি কাঁটাচামচ করে এবং প্রয়োগ করে। এটি কমান্ডটি কার্নেলের কাছে প্রেরণ করে এবং তারপরে কার্নেল সিদ্ধান্ত নিয়েছে #!যে স্ক্রিপ্টের মধ্যে লাইনটি বিশ্লেষণ করে এই কমান্ডটি কীভাবে কার্যকর করা হবে । এর পরে কার্নেলটি নির্দিষ্ট দোভাষী (এই ক্ষেত্রে সম্ভবত একটি bashসাবশেল) চালু করে। এর জন্য পরিবর্তনের somescript.shজন্য তার পরিবেশটি প্যারেন্ট শেলকে প্রভাবিত না করে সাবহেলে বিচ্ছিন্ন করা হয়।

আপনি যদি শেলটি অন্য কোনও প্রক্রিয়া আরম্ভ না করে নিজেই স্ক্রিপ্টটি পড়তে চান তবে আপনাকে স্পষ্টভাবে এটি .বা sourceকীওয়ার্ড ব্যবহার করে বলতে হবে ।


বিস্তারিত ব্যাখ্যার জন্য ধন্যবাদ। :) এখন আমি দেখতে পাচ্ছি যে কথিত স্ক্রিপ্ট থেকে এটি করার কোনও উপায় নেই, তবে ভাগ্যক্রমে প্যারেন্ট শেলকে বলা যেতে পারে যে aliasকমান্ডটি দিয়ে সাবস্কেল তৈরি না করা , যেমন স্কট প্রস্তাবিত।
alu

1

আপনি যদি ./somescript.shকোনও বাহ্যিক প্রোগ্রাম হিসাবে চালনা করেন তবে এটি চলমান শেল প্রক্রিয়ার অভ্যন্তরে কিছুই করতে পারে না, যেমন অ-রফতানি ভেরিয়েবল অ্যাক্সেস করা, ভেরিয়েবলগুলি সেট করা, বর্তমান ডিরেক্টরি পরিবর্তন করা ইত্যাদি around এর আশেপাশের কোনও উপায় নেই।

(ঠিক আছে, ঠিক আছে, আপনি সাব-প্রসেস থেকে একটি ডিবাগার চালাতে সক্ষম হতে পারেন এবং পিতামাতার প্রক্রিয়াটির স্মৃতিটিকে সামঞ্জস্য করতে পারেন But তবে আপনি যদি এটি চেষ্টা করেন তবে সর্বাধিক সম্ভাব্য ফলাফলটি প্যারেন্ট শেলটি ক্র্যাশ করছে))

আপনি চালাতে প্রয়োজন . ./somescript.sh। আপনি যদি এটি পছন্দ করেন তবে এটি একটি উপনামের পিছনে বা ফাংশনটি লুকিয়ে রাখতে পারেন, তবে আবার উপন্যাস বা ফাংশন সংজ্ঞাটি প্যারেন্ট শেলের মধ্যে করতে হবে।


0

আমি মনে করি আপনি যে স্ক্রিপ্টটি চালানোর চেষ্টা করছেন তা কার্যকরযোগ্য নয়। chmod a+x somescript.shসেই ফাইলটিতে ব্যবহারকারী, গোষ্ঠী এবং অন্যান্য (ইউগো) জন্য এক্সিকিউট বিট যুক্ত করবে। ফাইলের প্রথম লাইনেও প্রয়োজন হবে #! শীর্ষে লাইন, মত #!/bin/bash

ls -l somescript.shফাইলের জন্য আপনাকে rwx ট্রিপল্টগুলি পড়ুন (পড়ুন / লিখুন / সম্পাদন করুন) আপনার নিজেরাই এই ফাইলটির মালিকানা ধরে নিয়ে কমপক্ষে প্রথম সেটটিতে একটি এক্স দরকার হবে।


স্ক্রিপ্টগুলি নিজেই সূক্ষ্মভাবে কাজ করে তবে শেলের পরিবেশগত পরিবর্তনগুলি পরিবর্তন করতে সক্ষম হয়ে আমি বর্তমান শেলটিতে এটি সম্পাদন করতে চাই।
alu

স্ক্রিপ্টে আপনি চান ভেরিয়েবলটি রফতানি করতে না export PATH=$PATH:/usr/local/binচাইলে আপনার $ PATH- তে / usr / স্থানীয় / বিন যুক্ত করতে চান, তবে আপনার চলমান পরিবেশের ভেরিয়েবলগুলি পরিবর্তন করতে আপনার ফাইলটি উত্সের প্রয়োজন। এই প্রশ্নটি সত্যিই "বাশ স্ক্রিপ্ট থেকে আমার চলমান শেলের মধ্যে আমি কীভাবে আমার পরিবেশের পরিবর্তনগুলি পরিবর্তন করব?" স্ক্রিপ্টটি . ./somescript.shঠিকঠাক কার্যকর করছে - আপনি কোনও ফাইলে উত্স হিসাবে ডট কমান্ড ব্যবহার করছেন। tcsh একই জিনিসটির জন্য "উত্স" ব্যবহার করে।
এআর ডিয়েডেরিচ

একটি ভেরিয়েবল পরিবর্তন করা কেবল একটি উদাহরণ ছিল। আমার প্রশ্নটি হ'ল শেলটি বলতে গেলে সেখানে বিন্দু হওয়া উচিত কিনা তা লিখে বলা সম্ভব (উদাহরণস্বরূপ স্ক্রিপ্ট থেকে)
alu

ডটটি সহজেই ভুলে যেতে পারে যা স্ক্রিপ্টের আচরণ পুরোপুরি পরিবর্তন করতে পারে।
alu

0
export PATH=$PATH:.

শেলটিতে সেই কমান্ডটি চালনা করা বা এটি আপনার শেল কনফিগারেশন ফাইলটিতে যুক্ত করা বর্তমান ডিরেক্টরিটি PATH ভেরিয়েবলের সাথে যুক্ত হবে। PATH ভেরিয়েবল হল ডিরেক্টরিগুলির একটি তালিকা যেখানে আপনার কমান্ড দেওয়ার সময় আপনার শেল বাইনারিগুলি কার্যকর করতে দেখবে।

এটি আপনাকে ছাড়াই বর্তমান ডিরেক্টরিতে কোনও এক্সিকিউটেবল চালানোর অনুমতি দেবে ./


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