ব্যাশ শেল স্ক্রিপ্ট (ইউনিক্সে)। প্রোফাইলটি পুনরায় লোড করুন?


130

আমি শেল স্ক্রিপ্টিং বাশ করতে নতুন এবং আমি একটি চ্যালেঞ্জ পেয়েছি। আমি জানি আমি কেবল আমার "। প্রোফাইল" ফাইলটি পুনরায় লোড করতে পারি:

. .profile

তবে আমি লিখছি এমন একটি বাশ স্ক্রিপ্টে এটি কার্যকর করার চেষ্টা করছি এবং এটি ঠিক কাজ করছে না। কোন ধারনা? আমি স্পষ্ট করতে অন্য কিছু সরবরাহ করতে পারি?

ধন্যবাদ


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

1
আমি আপনার প্রশ্নের উত্তর পেয়েছি :)
কলব ক্যানিয়ন

উত্তর:


195

আপনার বর্তমান শেলটি পুনরায় লোড করার জন্য এটি ব্যবহার করুন:

source ~/.profile

1
আপনার কি বিকল্প সমাধান আছে? কারণ sourceকমান্ডটি ব্যবহার করে ফাইলটি স্ক্রিপ্ট হিসাবে চালিত হবে ... সবচেয়ে খারাপ ক্ষেত্রে যদি কেউ MyVar="$foo$MyVar"তাদের বাশ_প্রোফাইলে যেমন একটি পরিবর্তনশীল অ্যাসাইনমেন্ট ব্যবহার করে source ~/.profileতবে শেষ ফলাফলটি দেয় MyVar="$foo$MyVar$MyVar", সুতরাং এর $MyVarপরে ভুল মান হবে। (খারাপ অভ্যাস নির্বিশেষে, কেবল একটি বিকল্প সমাধানের জন্য জিজ্ঞাসা করুন)
জেফ্রি এমভুতু মাবিলামা


5

/ উত্স। /। প্রোফাইল ফাইলটি পুনরায় লোড করার চেষ্টা করার সময় বেশ কয়েকটি সমস্যা দেখা দেয়। [এটি উবুন্টু লিনাক্সকে বোঝায় - কিছু ক্ষেত্রে আদেশের বিবরণ পৃথক হবে]

  1. আপনি কি এটি সরাসরি টার্মিনালে বা কোনও স্ক্রিপ্টে চালাচ্ছেন?
  2. কীভাবে আপনি এটি কোনও স্ক্রিপ্টে চালাবেন?

বিজ্ঞাপন. 1)

এটি সরাসরি টার্মিনালে চালানোর অর্থ এখানে কোনও সাব-শেল তৈরি হবে না। সুতরাং আপনি দুটি কমান্ড ব্যবহার করতে পারেন:

source ~/.bash_profile

অথবা

. ~/.bash_profile

উভয় ক্ষেত্রেই। প্রোফাইল ফাইলের সামগ্রীর সাথে পরিবেশ আপডেট হবে update

বিজ্ঞাপন 2) আপনি কল করে যে কোনও বাশ স্ক্রিপ্ট শুরু করতে পারেন

sh myscript.sh 

অথবা

. myscript.sh

প্রথম ক্ষেত্রে এটি একটি সাবশেল তৈরি করবে যা আপনার সিস্টেমের পরিবেশের ভেরিয়েবলগুলিকে প্রভাবিত করবে না এবং তারা কেবল সাব-শেল প্রক্রিয়াতেই দৃশ্যমান হবে। সাবশেল কমান্ড শেষ করার পরে রপ্তানি ইত্যাদির কোনওটিই প্রয়োগ করা হবে না। এটি একটি প্রচলিত ত্রুটি এবং প্রচুর সময় হারাতে অনেক ডেভলপারদের কারণ দেয়।

আপনার পরিবর্তনগুলি আপনার স্ক্রিপ্টে প্রয়োগ করার জন্য বিশ্ব পরিবেশের জন্য প্রভাব ফেলতে স্ক্রিপ্টটি চালিত করতে হবে

.myscript.sh

কমান্ড।

আপনার স্ক্রিপ্টটি সাবসেলে চালিত হচ্ছে না তা নিশ্চিত করার জন্য আপনি এই ফাংশনটি ব্যবহার করতে পারেন। (আবার উদাহরণ উবুন্টু শেলের জন্য)

#/bin/bash

preventSubshell(){
  if [[ $_ != $0 ]]
  then
    echo "Script is being sourced"
  else
    echo "Script is a subshell - please run the script by invoking . script.sh command";
    exit 1;
  fi
}

আমি আশা করি এটি কিছু সাধারণ ভুল বোঝাবুঝি পরিষ্কার করে দেয়! : ডি গুড লাক!


4

বাশ স্ক্রিপ্টটি পৃথক সাব-শেলে চলে। এই কাজটি করার জন্য আপনাকে এই অন্যান্য স্ক্রিপ্টটিও উত্স করতে হবে।


অন্যান্য স্ক্রিপ্টটি "উত্স" -র মাধ্যমে আপনি ঠিক কী বোঝাতে চেয়েছেন তা আমি নিশ্চিত নই (এখনও এগুলির মধ্যে এখনও নতুন)। দয়া করে এটিতে কিছুটা প্রসারিত করতে পারেন। তবে আমি চেষ্টা করেছি: $। ~ /। প্রোফাইল $ / ইত্যাদি / কোনও সাফল্য ছাড়া প্রোফাইল। তোমাকে অনেক ধন্যবাদ.
আমির রুস্তমজাদেহ

1
@ এমিরুস্তান: আপনার স্ক্রিপ্টটিতে আপনার .profileফাইলটিকে এরকম কিছু উত্সের প্রয়োজন হবে: এবং আপনার স্ক্রিপ্টটি এটি স্যোসারিংয়ের . $HOME/.profileমাধ্যমে শুরু করতে হবে। এর মতো কিছু. /path/to/yourscript
পরবর্তী বিজ্ঞপ্তি না দেওয়া পর্যন্ত বিরতি দেওয়া হয়েছে।

1
@amirrustam দয়া করে পড়ুন superuser.com/questions/176783/...
lesmana

1

চেষ্টা করুন:

#!/bin/bash
# .... some previous code ...
# help set exec | less
set -- 1 2 3 4 5  # fake command line arguments
exec bash --login -c '
echo $0
echo $@
echo my script continues here
' arg0 "$@"
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.