প্যারেন্ট শেল থেকে সাব-শেল থেকে ভিএআর রফতানি করবেন কীভাবে?


10

আমার একটি কর্ন শেল স্ক্রিপ্ট রয়েছে

#!/bin/ksh
# set the right ENV
case $INPUT in
abc)
  export BIN=${ABC_BIN}
  ;;
  def)
  export BIN=${DEF_BIN}
  ;;
  *)
  export BIN=${BASE_BIN}
  ;;
esac
# exit 0 <- bad idea for sourcing the file

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

আমি সম্পর্কে জানি

. .myscript.sh

তবে 'সোর্সিং' না করে কি করার উপায় আছে? যেহেতু আমার ব্যবহারকারীরা প্রায়শই 'উত্স' করতে ভুলে যান।


EDIT1: "প্রস্থান 0" অংশটি সরিয়ে ফেলতে - এটি প্রথমে চিন্তা না করে কেবল টাইপ করছিলাম

এডিআইটি 2: আমার কেন এটি প্রয়োজন তার আরও বিশদ যুক্ত করার জন্য: আমার বিকাশকারীরা (সরলতার জন্য) 2 টি অ্যাপ্লিকেশনের জন্য কোড লেখেন: এবিসি এবং ডিএফ। প্রতিটি অ্যাপ্লিকেশন পৃথক ব্যবহারকারী ইউএসআরসিসি এবং ইউএসডিএফ দ্বারা উত্পাদিত হয়, অতএব তাদের $ বিন, $ সিএফজি, $ ওআরআহোম সেটআপ করুন - যা কিছু অ্যাপ্লিকেশানের সাথে সুনির্দিষ্ট।

সুতরাং

  • উপরের স্ক্রিপ্টে এবিসির $ BIN = / opt / abc / bin # $ ABC_BIN
  • DEF- এর $ বিন = / opt / def / বিন # bin DEF_BIN

প্রভৃতি

এখন, ডিভ বাক্সে বিকাশকারীরা তাদের নিজস্ব অ্যাকাউন্ট 'জাস্টিন_কেস' এর অধীনে একই সাথে এবিসি এবং ডিইএফ উভয়কেই বিকাশ করতে পারে এবং আমি তাদের ফাইলটি (উপরে) উত্স হিসাবে তৈরি করি যাতে তারা তাদের ENV বার সেটিংস পিছনে পিছনে স্যুইচ করতে পারে। (IN বিনের একবারে $ এবিসি_বিইনকে নির্দেশ করা উচিত এবং তারপরে আমাকে $ BIN = $ DEF_BIN এ স্যুইচ করা দরকার)

এখন, স্ক্রিপ্টটিতে একই অ্যাপ্লিকেশন ইত্যাদির সমান্তরাল বিকাশের জন্য নতুন স্যান্ডবক্সও তৈরি করা উচিত this এটি আমাকে ইন্টারেক্টিভভাবে করতে সক্ষম করে, স্যান্ডবক্সের নাম জিজ্ঞাসা, ইত্যাদি makes

  • / হোম / justin_case / sandbox_abc_beta2
  • / হোম / justin_case / sandbox_abc_r1
  • / হোম / justin_case / sandbox_def_r1

আমি বিবেচনা করেছিলাম এমন অন্যান্য বিকল্পটি হ'ল এলিয়াস লিখতে এবং সেগুলি প্রতিটি ব্যবহারকারীর প্রোফাইলে যুক্ত করা

  • ওরফে 'সেটআপ_এনভি =। .myscript.sh '

এবং এটি দিয়ে চালান

  • setup_env প্যারামিটার 1 ... প্যারামিটারএক্স

এটি এখন আমার আরও অর্থবোধ করে


হ্যাঁ - আপনি এটির নাম বা ফাংশন দিয়ে করতে পারেন (আমি ফাংশনগুলিকে নিজেরাই পছন্দ করি) যেখানে আপনার ফাংশন প্রোড থাকে () {রফতানি VAR = স্নোপি; }; এবং ফাংশন ডেভ () {রফতান VAR = কাঠের দড়ি; };
ক্রিস

উত্তর:


11

আমি মনে করি এটি একটি "কিছু করতে পারে না" ধরণের সমস্যা ...

প্রথম - আপনি শেষে 0 থেকে প্রস্থান করার কারণে আপনি সেই স্ক্রিপ্টটি উত্স করতে চান না।

দ্বিতীয়ত, কোনও ইউনিক্স শিশু প্রক্রিয়া সরাসরি পিতামাতার পরিবেশ পরিবর্তন করতে পারে না। অন্যথায় পাগল জিনিস সব ধরণের সম্ভব হবে।

আপনি কি তাদের পরিবেশে ডিফল্ট প্রোফাইল বা বাশার্ক ফাইল দিয়ে কিছু যুক্ত করতে পারেন, বা যে প্রোগ্রামটি চালানোর চেষ্টা করছেন তা আপনি কি তার জন্য একটি র‌্যাপার লিখতে পারেন?

আমাকে "র‍্যাপার" ধারণাটি বিশদ করার অনুমতি দিন।

যাক আপনি প্রযোজনা বা বিকাশ চান কিনা তার উপর নির্ভর করে আপনি পরিবেশ পরিবর্তনশীল "অপশনগুলি" এর মধ্যে প্রোড বা ডিইভি এর সাথে প্রোগ্রামটি স্নোপি চালাতে চান। যদি এটি সেট না করা থাকে, আসুন আমরা বলি যে স্নোপি উত্পাদন এবং বিকাশের জন্য ডেটাবেস মুছার মতো অদ্ভুত কিছু করে ...

স্নোপি.বিনের (বা .snoopy.bin) "স্নোপি" নামকরণ করুন

তারপরে "স্নুপি" নামের একই স্থানে একটি স্ক্রিপ্ট রাখুন যা এতে রয়েছে:

#!/bin/sh

export OPTIONS

case "$OPTIONS" 
in
  PROD) ;;
  DEV) ;;
  *) OPTIONS=DEV ;;
esac

#the binary is actually named snoopy.bin 

exec "$0.bin" "$@"

আপনি যদি আসল ফাইলটি নিয়ে উপহাস করতে না চান তবে এই স্ক্রিপ্টটি ফাইল সিস্টেমে এমন কোনও জায়গায় রাখুন যা ব্যবহারকারীর PATH- তে প্রকৃত স্নোপি প্রোগ্রামের চেয়ে এগিয়ে থাকবে এবং স্ক্রিপ্টের এক্সিকিউট স্টেটমেন্টে বাইনারিটির পুরো পথ পাবে ...


5

উত্তরটি সোর্সিং। সোর্সিং আপনাকে বর্তমান শেলটিতে একটি স্ক্রিপ্টে ভেরিয়েবলগুলি অন্তর্ভুক্ত করতে দেয় তবে এর কোনও পিতামাতা কখনও নয়। এটি সত্য, কোনও প্রস্থান কমান্ড বা অনুরূপ ব্যবহার না করার বিষয়ে আপনাকে সতর্কতা অবলম্বন করতে হবে, কারণ এটি আপনার বর্তমান শেলটি বন্ধ করে দেবে।

আপনি "।" ব্যবহার করে একটি স্ক্রিপ্ট উত্স করতে পারেন, অর্থাত্‍

। ./myscript.ksh



3

আপনি যদি চেষ্টা করেন ...

#!/bin/bash

mknod fifo p

(
       echo 'value' > fifo &
)

VARIABLE=`cat fifo`
rm fifo

এটি ঠিক পরিবর্তনশীল রফতানি নয়, তবে এটি পিতামাতার প্রক্রিয়াটির সাথে প্রাথমিক যোগাযোগ সরবরাহ করতে পারে।


1

ঠিক আছে, এখন হাসবেন না। খুব দ্রুত এবং খুব নোংরা সমাধান যুক্ত করা হয়

echo "Please copy and paste this command:"
echo ""
echo "export BIN=\"$BIN\""

আপনার স্ক্রিপ্টে।

অন্য পদ্ধতিরexecআপনার স্ক্রিপ্টে কেবলমাত্র একটি অধস্তন EL ঝাঁকুনি দেওয়া হতে পারে অন্য কোনও প্রম্পট সহ (পরিবর্তন করুন $ PS1 ব্যবহারকারীদের কোন পরিবেশের মধ্যে তারা বিভ্রান্তি হ্রাস করতে কাজ করছে তা অবহিত করার জন্য))

আরেকটি পন্থা (আমার প্রিয়)। ব্যবহারকারীরা আপনার স্ক্রিপ্ট উত্স করতে ভুলে গেছেন কেন? সোর্সিং হ'ল স্ট্যান্ডার্ড উপায় way তাদের স্মরণ করিয়ে দেওয়ার একটি ভাল উপায় হ'ল প্রথম লাইনটি ( #!/bin/sh) এবং তারপরে মুছে ফেলা chmod a-x। এটি এর পরেও উত্সাহিত করা যেতে পারে, তবে সম্ভবত এটি ভুলভাবে কার্যকর করা যায় না।

ভাড়া : সর্বোপরি, আমি মনে করি আপনি প্রথমে একটি অদ্ভুত ধারণা পেয়েছেন। হয়তো অদ্ভুত নয় ... আমি কিছুটা অ-ইউনিক্স স্টাইলে বলব। আমি জীবনে কখনও পিতামাতার কাছে পরিবেশ রফতানি করার দরকার পড়েনি। আমি একবার একই পরিস্থিতি দেখেছি - লগইন করুন। একটি একক ওরাকল অ্যাকাউন্টের জন্য তিনটি ভিন্ন পরিবেশের মধ্যে কোনটি জিজ্ঞাসা করবেন তা জিজ্ঞাসা করুন। খারাপ ধারণা, শেষ পর্যন্ত এটি প্রমাণিত হয়েছে যে ব্যবহারকারীরা সুডোতে স্থানান্তরিত করা পছন্দ করে (তারা তিনটি ভিন্ন ওআরএক্সএক্সএক্সএক্স অ্যাকাউন্টে sudo'd)। আপনি কি অর্জন করার চেষ্টা করছেন, যদি আমি জিজ্ঞাসা করতে পারি?

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