প্যারেন্ট শেলটিতে উপলব্ধ সাব-শেল থেকে কীভাবে একটি পরিবর্তনশীল করা যায়


11

ওয়েব সার্ভিস থেকে কিছু প্রতিবেদন সময় দেওয়ার জন্য আমি দ্রুত এবং নোংরা স্ক্রিপ্ট লিখেছি:

BASE_URL='http://example.com/json/webservice/'
FIRST=1
FINAL=10000

for report_code in $(seq 1 $FINAL); do
  (time -p response=$(curl --write-out %{http_code} --silent -O ${BASE_URL}/${report_code}) ) 2> ${report_code}.time

  echo $response  # <------- this is out of scope!  How do I fix that?
  if [[ $response = '404' ]]; then
    echo "Deleting report # ${report_code}!"
    rm ${report_code}
  else
    echo "${report_code} seems to be good!"
  fi
done

আমাকে timeএকটি সাবশেলে কমান্ডটি মোড়ানো দরকার যাতে আমি এর আউটপুটটিকে পুনর্নির্দেশ করতে পারি তবে $responseএটি প্যারেন্ট শেলের জন্য উপলভ্য নয়। আমি কীভাবে এই সমস্যাটি পেতে পারি?

উত্তর:


11

আপনি কোনও ত্রুটি-প্রবণ মার্শেলিং এবং জঘন্য যোগাযোগ না করেই তার পিতামাতার কাছে সাব-শেল থেকে কোনও ভেরিয়েবলের মান আনতে পারবেন না।

ভাগ্যক্রমে, আপনার এখানে সাবসেলের দরকার নেই। পুনঃ দিকনির্দেশ শুধুমাত্র প্রয়োজন গোষ্ঠীবদ্ধ কমান্ড দিয়ে { … }, না একটি subshell।

{ time -p response=$(curl --write-out '%{http_code}' --silent -O "${BASE_URL}/${report_code}"); } 2> "${report_code}.time"

( পরিবর্তনশীল বিকল্পের চারপাশে ডাবল উক্তিগুলি ভুলে যাবেন না ))


এটি মজার যে প্রতিটি প্রোগ্রামিং ভাষা এটি করতে পারে। আমি ইতিমধ্যে শেলের কোনও সম্ভাব্য সমাধান ছাড়াই 1 ঘন্টা গুগলিং ব্যয় করেছি। আমি হতাশ।
করার ক্রা

1
@ টোকরা নং কোনও প্রোগ্রামিং ভাষা এটি করতে পারে না। (প্রায়) কোনও প্রোগ্রামিং ল্যাঙ্গুয়েজ তার পিতামাতার কাছে সাব্রোটিন বা নির্দেশিকা ব্লক থেকে একটি ভেরিয়েবলের মান আনতে পারে এবং আমি আমার উত্তরে যা স্পষ্টভাবে ব্যাখ্যা করি তা হল: { … }সাবসেলের পরিবর্তে কমান্ড গ্রুপিং ব্যবহার করুন ( … )
গিলস

4

ফেলো ইউ অ্যান্ড এল ব্যবহারকারীগণ: main()ফাংশন সহ সি-স্টাইল ব্যবহারের জন্য আমার উত্তরকে নিম্নমুখী করার আগে দয়া করে এই লিঙ্কটি দেখুন: https://unix.stackexchange.com/a/313561/85039 স্ক্রিপ্টগুলিতে মূল ফাংশন ব্যবহার করা একটি প্রচলিত অভ্যাস যা বহু পেশাদারদের দ্বারা ব্যবহৃত হয় মাঠে.


গিলস যেমন উল্লেখ করেছেন, সাব-শেলগুলি তাদের পরিবেশের বাইরে চলকগুলি উপলব্ধ করতে পারে না। তবে আসুন এই সমস্যাটি অন্য একটি কোণ থেকে নেওয়া যাক - আপনি যদি আপনার স্ক্রিপ্টটি ফাংশনে লিখেন তবে পরিবর্তনশীল হিসাবে এটি ঘোষণা করা সম্ভব localএবং এটি সম্পাদিত হতে পারে।

বাশ 4.3 এর ম্যানুয়াল থেকে localবর্ণনা:

... স্থানীয় যখন কোনও ফাংশনের মধ্যে ব্যবহার করা হয়, তখন এটি ভেরিয়েবলের নামটি সেই ফাংশন এবং তার বাচ্চাদের মধ্যে একটি দৃশ্যমান সুযোগ সীমাবদ্ধ করে দেয় ...

উদাহরণ:

#!/bin/bash

outter()
{
    for i in $(seq 1 3)
    do
        var=$i
    done
}

main()
{
    local var=0
    outter
    echo $var
}
main "$@"
$ ./testscript.sh                                                                                                        
3

আপনি দেখতে পারবেন যে লুপিং ফাংশনটির 3 টি পুনরাবৃত্তির পরে ভেরিয়েবলটি সংশোধন করা হয়েছে।


হুম, সি প্রোগ্রামারদের জন্য অনির্বচনীয় আচরণ। আমি সাধারণত outterএকটি বিশ্বব্যাপী উদাহরণ উল্লেখ করতে আশা করব var
রুসলান

এই উত্তরের কিছু ত্রুটি রয়েছে। "$var"কল আউট প্রয়োজন হয় না outter। এটা কিছু করে না। এবং কিছু local var=0করে না; কল ইউউফ outterওভাররাইট করে var, যেমন আপনি বলেছিলেন।
গোলার র‌্যামব্লার 14

@ গোলারআম্বলার আমি "$var"অবস্থানগত যুক্তি হিসাবে সরিয়েছি outter; সত্যি বলতে, এটি একটি অভ্যাসের বাইরে। আপনি local var=0 অংশ হিসাবে বিস্তারিত বলতে পারেন ?
সের্গেই কোলোডিয়াজনি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.