অন্য শেল স্ক্রিপ্ট থেকে কীভাবে একটি শেল স্ক্রিপ্ট কল করবেন?


736

আমার কাছে দুটি শেল স্ক্রিপ্ট রয়েছে a.shএবং b.sh

আমি কীভাবে b.shশেল স্ক্রিপ্টের মধ্যে থেকে কল করতে পারি a.sh?


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

14
এটি আসলে কোনও সুনির্দিষ্ট প্রশ্ন নয় বা এটি সমস্যা সমাধানের জন্য পূর্বের প্রচেষ্টাও প্রদর্শন করে না।
ক্রিস

1
আমার একটি সমস্যা ছিল যেটি কার্যকর b.shকরার অনুমতি ছিল না। এটি যাচাই করা ভাল জিনিস হতে পারে।
seth10

./পরিবর্তে, স্ক্রিপ্ট নামের আগে যুক্ত করুন:, b.shব্যবহার:./b.sh
বেনি

1
যে কেউ রাখে পেয়ে No such file or directoryত্রুটি stackoverflow.com/a/2920431/1356559
আমর Lotfy

উত্তর:


955

আপনি এটি করতে পারেন এমন কয়েকটি উপায় রয়েছে:

  1. অন্যান্য স্ক্রিপ্টকে সম্পাদনযোগ্য করে তুলুন, #!/bin/bashশীর্ষে লাইনটি যুক্ত করুন এবং ফাইলটি যেখানে is PATH এনভায়রনমেন্ট ভেরিয়েবলের দিকে যুক্ত করুন। তারপরে আপনি এটিকে একটি সাধারণ আদেশ হিসাবে কল করতে পারেন;

  2. বা এটির সাথে কল sourceকমান্ড (ওরফে হয় .) এই মত: source /path/to/script;

  3. বা ব্যবহার bashএটি চালানো কমান্ড প্রয়োগ করুন: /bin/bash /path/to/script;

প্রথম এবং তৃতীয় পদ্ধতিগুলি অন্য প্রক্রিয়া হিসাবে স্ক্রিপ্টটি কার্যকর করে, সুতরাং অন্য স্ক্রিপ্টের ভেরিয়েবল এবং ফাংশন অ্যাক্সেসযোগ্য হবে না।
দ্বিতীয় পদ্ধতিটি প্রথম স্ক্রিপ্টের প্রক্রিয়ায় স্ক্রিপ্টটি কার্যকর করে এবং অন্য স্ক্রিপ্ট থেকে ভেরিয়েবল এবং ফাংশনগুলিতে টান দেয় যাতে তারা কলিং স্ক্রিপ্ট থেকে ব্যবহারযোগ্য।

দ্বিতীয় পদ্ধতিতে, আপনি যদি exitদ্বিতীয় স্ক্রিপ্ট ব্যবহার করছেন তবে এটি প্রথম স্ক্রিপ্টটিও প্রস্থান করবে। যা প্রথম এবং তৃতীয় পদ্ধতিতে ঘটবে না।


30
মনে রাখবেন chmod a+x /path/to/fileবা অন্যথায় এটি কার্যকর হতে চলেছে না। শুধুমাত্র ./script পদ্ধতিতে প্রযোজ্য।
নাথান লিলিয়ান্থল

3
ডস-এ তৈরি করা হয় এবং তারপরে ইউনিক্স পরিবেশে>> ডস 2 ইউনিক্স <স্ক্রিপ্ট নাম>
অভিষেক চ্যাটার্জী

3
@cecemel প্রথম ও তৃতীয় উপায়টি স্বাভাবিকভাবে ইন-ব্যাকগ্রাউন্ড সিনট্যাক্স ব্যবহার করে "async" হতে পারে।
কিছু প্রোগ্রামার ডুড

16
সমস্যাটি sourceহ'ল exit
কথিত

18
@ user528025 এর .জন্য কোনও উপাধি নয় source, বরং অন্য উপায়। sourceকোনও বাশ এক্সটেনশন, যখন .কোনও পসিক্স সুসংগত শেলটিতে কাজ করে।
স্কোর_আউন্ডের

207

এটা দেখ.

#!/bin/bash
echo "This script is about to run another script."
sh ./script.sh
echo "This script has just run another script."

4
এটি ধরে নিয়েছে যে স্ক্রিপ্ট.শ একই ডিরেক্টরিতে যা-ই স্ক্রিপ্ট চলমান রয়েছে as আপনি যদি অন্য কোথাও কোনও স্ক্রিপ্ট কল করতে চান, আপনি বলবেনsh <path to script>/script.sh
মরগান কেনন

32
এটাও ব্যবহার দুই শেল, bashএবং sh। এমনকি shআসলে যখন bashএটি একই আচরণ করে না। আপনি যদি ব্যবহার করছেন #!/bin/bashতবে আপনি সম্ভবত ব্যবহার করতে চান bash script.sh(বা কেবলমাত্র ./script.shসেই স্ক্রিপ্টগুলির হ্যাশবাং ব্যবহার করতে পারেন)।
মার্টিন টর্নয়েজ

1
আমি chmod +x.sh ফাইলটিতে সেট করে দিলেও অনুমতি প্রাপ্তি ত্রুটিটিকে অস্বীকার করে । কোন পরামর্শ?
ইসাএইচ ওয়েথারস

@ আইসাকওয়েথাররা chmod 777 চেষ্টা করুন
জ্যানাক মীনা

114

আপনি এটি করতে পারেন এমন বেশ কয়েকটি উপায় রয়েছে। স্ক্রিপ্টটি কার্যকর করার জন্য টার্মিনাল:

#!/bin/bash
SCRIPT_PATH="/path/to/script.sh"

# Here you execute your script
"$SCRIPT_PATH"

# or
. "$SCRIPT_PATH"

# or
source "$SCRIPT_PATH"

# or
bash "$SCRIPT_PATH"

# or
eval '"$SCRIPT_PATH"'

# or
OUTPUT=$("$SCRIPT_PATH")
echo $OUTPUT

# or
OUTPUT=`"$SCRIPT_PATH"`
echo $OUTPUT

# or
("$SCRIPT_PATH")

# or
(exec "$SCRIPT_PATH")

স্পেস সহ পথের জন্য এই সমস্তই সঠিক!


41
তাদের পার্থক্য কি? কেন একজন, আরেকজন কেন?
রকেটস্পেসার

। "CRIP SCRIPT_PATH" পছন্দনীয়
হ্যারি ম্যামফোর্ড-টার্নার

1
আমি কেবল যুক্ত করতে পারি যে এগুলি সমস্ত সমতুল্য নয়, উদাহরণস্বরূপ sh "$ SQLT_PATH" এবং ব্যাশ "$ SQLT_PATH" চালানো হবে না!
টহলর

58

যে উত্তরটি আমি সন্ধান করছিলাম:

( exec "path/to/script" )

উল্লিখিত হিসাবে, execনতুন প্রক্রিয়া তৈরি না করে শেলটি প্রতিস্থাপন করে। যাইহোক , আমরা এটি একটি সাবশেলে রাখতে পারি, যা প্যারান্থেসিস ব্যবহার করে করা হয়।

সম্পাদনা: আসলেই ( "path/to/script" )যথেষ্ট।


11
এটি দেখতে বেশ জটিল মনে হচ্ছে। কেন শুধু সাথে এটি কল /path/to/script? আমি এখানে কি মোটেই প্রয়োজন দেখছি না exec?
মার্টিন টর্নয়েজ

আপনি যেহেতু ইননিং করছেন না কেন এই সাবশেলের প্রয়োজন হয় না exec
কারেল Vlk

6
আপনি কীভাবে এই স্ক্রিপ্টটি যুক্তি দিয়ে কার্যকর করবেন?
ভড়গব

আপনি যদি এখনও সাব-স্ক্রিপ্টের আউটপুট ক্যাপচার করতে চান তবে চেষ্টা করুন source (উত্স "পাথ / টু / স্ক্রিপ্ট")
সেমিসিগিন্টি

@Bhargav এই লিঙ্কটি অনুসরণ করুন stackoverflow.com/questions/14302389/...
tpbafk

16

নির্ভর করে. সংক্ষেপে ... আপনি যদি বর্তমান কনসোলে লোড ভেরিয়েবলগুলি চান এবং কার্যকর করেন তবে আপনি source myshellfile.shআপনার কোডটিতে ব্যবহার করতে পারেন । উদাহরণ:

!#/bin/bash
set -x
echo "This is an example of run another INTO this session."
source my_lib_of_variables_and_functions.sh
echo "The function internal_function() is defined into my lib."
returned_value=internal_function()
echo $this_is_an_internal_variable

set +x

যদি আপনি কেবল একটি ফাইল কার্যকর করতে চান এবং কেবলমাত্র আপনার জন্য ইন্টারেস্টিংয়ের ফলাফলটি হয় তবে আপনি এটি করতে পারেন:

!#/bin/bash
set -x
./executing_only.sh
sh i_can_execute_this_way_too.sh
bash or_this_way.sh
set +x

আমি আপনাকে সাহায্য করবে আশা করি। ধন্যবাদ।


2
নোট যে sourceএকটি বাশ নির্দিষ্ট বৈশিষ্ট্য। স্ট্যান্ডার্ড বোর্ন শেলটিতে কেবল .(উদাঃ . other_script.sh) রয়েছে।
মার্টিন টর্নয়েজ

15

আপনি /bin/shঅন্য স্ক্রিপ্টটি কল করতে বা চালাতে ব্যবহার করতে পারেন (আপনার আসল স্ক্রিপ্টের মাধ্যমে):

 # cat showdate.sh
 #!/bin/bash
 echo "Date is: `date`"

 # cat mainscript.sh
 #!/bin/bash
 echo "You are login as: `whoami`"
 echo "`/bin/sh ./showdate.sh`" # exact path for the script file

আউটপুটটি হবে:

 # ./mainscript.sh
 You are login as: root
 Date is: Thu Oct 17 02:56:36 EDT 2013

1
অবশ্যই এটি showdate.sh/ বিন / শের পরিবর্তে / বিন / শের অধীনে চলবে ?
ক্রিস ওয়াটস

আমি " /bin/sh ./showdate.sh", " /bin/bash ./showdate.sh", " ./showdate.sh" দিয়ে চেষ্টা করেছি এবং ফাইলটি চালাচ্ছি: mainscript.sh এবং একই আউটপুট পেয়েছি।
রঞ্জিতকুমার টি

10

স্ক্রিপ্টটি সম্পাদন করতে আপনি টার্মিনালে যা টাইপ করেছেন তা কেবল একটি লাইনে যুক্ত করুন!
উদাহরণ:

#!bin/bash
./myscript.sh &

যদি স্ক্রিপ্টটি কার্যকর করা হয় একই ডিরেক্টরিতে না হয় তবে কেবল স্ক্রিপ্টের সম্পূর্ণ পথ ব্যবহার করুন।
উদাহরণস্বরূপ: home / হোম / ইউজার / স্ক্রিপ্ট-ডিরেক্টরি /


&ব্যাকগ্রাউন্ড টাস্কের জন্য @ কার্পেটস্মোকার
আন্ড্রেই ক্রেসুটস্কি

9

প্রথমে আপনাকে কল করা ফাইলটি অন্তর্ভুক্ত করতে হবে:

#!/bin/bash
. includes/included_file.sh

তারপরে আপনি আপনার ফাংশনটিকে এভাবে কল করুন:

#!/bin/bash
my_called_function


8

যদি আপনার একই ডিরেক্টরিতে অন্য কোনও ফাইল থাকে তবে আপনি এটি করতে পারেন:

bash another_script.sh

অথবা

source another_script.sh

অথবা

. another_script.sh

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


5

শীর্ষ উত্তর যোগ করার প্রস্তাব দেওয়া #!/bin/bashবলা হচ্ছে উপ-স্ক্রিপ্ট প্রথম লাইন লাইন। কিন্তু এমনকি যদি আপনি কুঁড়েঘর যোগ করুন, এটা অনেক দ্রুততর * একটি উপ-শেল মধ্যে একটি স্ক্রিপ্ট চালাতে সমস্যা এবং আউটপুট ক্যাপচার:

$(source SCRIPT_NAME)

এই কাজ করে আপনি একই অনুবাদক চলমান রাখতে চান (যেমন অন্য ব্যাশ স্ক্রিপ্ট থেকে ব্যাশ থেকে) এবং নিশ্চিত করে যে উপ-স্ক্রিপ্ট কুঁড়েঘর লাইন মৃত্যুদন্ড কার্যকর করা হয় না।

উদাহরণস্বরূপ:

#!/bin/bash
SUB_SCRIPT=$(mktemp)
echo "#!/bin/bash" > $SUB_SCRIPT
echo 'echo $1' >> $SUB_SCRIPT
chmod +x $SUB_SCRIPT
if [[ $1 == "--source" ]]; then
  for X in $(seq 100); do
    MODE=$(source $SUB_SCRIPT "source on")
  done
else
  for X in $(seq 100); do
    MODE=$($SUB_SCRIPT "source off")
  done
fi
echo $MODE
rm $SUB_SCRIPT

আউটপুট:

~ ❯❯❯ time ./test.sh
source off
./test.sh  0.15s user 0.16s system 87% cpu 0.360 total

~ ❯❯❯ time ./test.sh --source
source on
./test.sh --source  0.05s user 0.06s system 95% cpu 0.114 total

* উদাহরণস্বরূপ যখন ভাইরাস বা নিরাপত্তা সরঞ্জামগুলি কোনো ডিভাইসে দৌড়াচ্ছে এটি একটি নতুন প্রক্রিয়া Exec একটি অতিরিক্ত 100 মিঃসে নিতে পারে।



4
 #!/bin/bash

 # Here you define the absolute path of your script

 scriptPath="/home/user/pathScript/"

 # Name of your script

 scriptName="myscript.sh"

 # Here you execute your script

 $scriptPath/$scriptName

 # Result of script execution

 result=$?

1
ফোল্ডার scriptPathবা scriptNameফাঁকা জায়গার সাথে ফাইলের নামটির জন্য ভুল
আন্ড্রেই ক্রাসসটকি

3

ধরুন নতুন ফাইলটি "/ home / satya / app / app_specific_env" এবং ফাইলের বিষয়বস্তু নীচে রয়েছে

#!bin/bash

export FAV_NUMBER="2211"

এই ফাইলটি রেফারেন্সটি ~ / .bashrc ফাইলে যুক্ত করুন

source /home/satya/app/app_specific_env

যখনই আপনি মেশিনটি পুনরায় চালু করবেন বা পুনরায় লাগান, echo $FAV_NUMBERটার্মিনালে চেষ্টা করুন in এটি মান আউটপুট করবে।

source ~/.bashrcকমান্ড লাইনে আপনি যদি এখনই প্রভাবটি দেখতে চান তবে সেক্ষেত্রে ।


3
chmod a+x /path/to/file-to-be-executed

এটাই আমার দরকার ছিল। একবার স্ক্রিপ্ট নিষ্পন্ন করা হবে ভালো এক্সিকিউটেবল তৈরি হয়, আপনি (আমার ক্ষেত্রে অন্তত) -এর মত অন্য কোন অতিরিক্ত অপারেশন প্রয়োজন হবে না shবা ./আপনি যখন স্ক্রিপ্ট আহ্বান করা হয়।

@ নাথান লিলিয়েন্টালের মন্তব্যে ধন্যবাদ


1

অন্যান্য ফাইল থেকে ফাংশন আমদানি করতে কিছু সমস্যা আছে।
প্রথম : আপনার এই ফাইলটি এক্সিকিউটেবল করার দরকার নেই। না করাই ভাল! শুধু যোগ কর

. file

সমস্ত ফাংশন আমদানি করতে। এবং তাদের সবগুলি এমন হবে যেন সেগুলি আপনার ফাইলে সংজ্ঞায়িত করা হয়েছে।
দ্বিতীয় : আপনি একই নামের সাথে ফাংশনটি সংজ্ঞায়িত করতে পারেন। এটি ওভাররাইট করা হবে। এটা খারাপ. আপনি যেমন ঘোষণা করতে পারেন

declare -f new_function_name=old_function_name 

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


(এসও-তে আপনাকে স্বাগতম!) ব্যবহারকারী প্রবীণকে সর্বশেষে ২০১১ সালে দেখা গিয়েছিল, শেলটি এক্সিকিউটিভ a.sh এক্সিকিউটিভ বি.এস করতে কীভাবে প্রশ্ন করা হয়েছিল (এবং না থাকলে a.sh চালানো চালিয়ে যাওয়া চালিয়ে যাবে কিনা তা প্রশ্ন করা বাছাই করা কঠিন) অন্যথায় আজ্ঞা ), অথবা আক্ষরিক করার আহ্বান b.sh । (আমার বানান পরীক্ষক ধরেন না bush versions)) (ইংরেজী ব্যাকরণ দিয়ে আপনাকে সাহায্য করার জন্য কি এমন কেউ আছে? (কখনও কখনও আমার ইচ্ছা ছিল।))
গ্রেইবার্ড

0

ব্যাকটিক্স ব্যবহার করুন।

$ ./script-that-consumes-argument.sh `sh script-that-produces-argument.sh`

তারপরে কনজিউমার স্ক্রিপ্টে আর্গুমেন্ট হিসাবে প্রযোজক স্ক্রিপ্টের আউটপুট আনুন।

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