বাশ স্ক্রিপ্টিং কোনও ফাংশনে স্থানীয়ভাবে প্রতিধ্বনিত হয়


13

ব্যাশ স্ক্রিপ্টগুলিতে আমি আমার ভেরিয়েবলগুলিকে স্থানীয় যেখানেই রাখতে পারি ফাংশনে রাখার চেষ্টা করি এবং তারপরে আমার যা প্রয়োজন তা পাসের মতো বেলো

#!/bin/bash

function FUNCTION() {
    local LOCAL="value"
    echo "$LOCAL"   # return this variable
}

GLOBAL=$(FUNCTION)

echo "$GLOBAL"

তবে ফাংশনের নিজস্ব প্রতিধ্বনি সহ যখন এটি করা সম্ভব হয় যাতে ফাংশনের যদি আউটপুটে তার নিজস্ব বার্তাগুলি থাকে তবে আমি এগুলি একটি পরিবর্তনশীলতে ধরতে পারি না

#!/bin/bash

function FUNCTION() {
    local LOCAL="value"
    echo "$LOCAL"                      # return this variable
    echo "This function is done now"   # do not return this variable
}

GLOBAL=$(FUNCTION)

echo "$GLOBAL"                         # should only echo 'value'

1
আরে আপনি সবাই কেন পুরানো, নন-পসিক্স function foo()সিনট্যাক্স ব্যবহার করছেন? আপনি 9 টি কম কিপঞ্চের সাথে আরও ভাল পসিক্স সামঞ্জস্য পেতে পারেন।
আর্থার 2e5

2
এই বাক্য
গঠনটি

1
@ আর্থার 2e5 মূলত কারণ কোডটির মাধ্যমে অনুসন্ধানের সময় "[a-zA-Z0-9] + \ (\) \ {" এর চেয়ে "ফাংশন" টাইপ করা সহজ
অ্যালেক্স জ্যানসেন

উত্তর:


17

আপনি সঠিক আউটপুট প্রবাহ ক্যাপচার করে ফাংশন দ্বারা মুদ্রিত যে কোনও কিছু ক্যাপচার করা যেতে পারে। সুতরাং কোনও কিছু মুদ্রণ এবং অন্য কিছু আউটপুট সংরক্ষণের সহজতম উপায় হ'ল অতিমাত্রায় আউটপুটটিকে স্ট্যান্ডার্ড ত্রুটিতে পুনর্নির্দেশ করা:

function FUNCTION() {
    local LOCAL="value"
    echo "$LOCAL"
    echo "This function is done now" >&2
}

আরেকটি সম্ভাবনা হ'ল সরাসরি লগ বার্তা প্রিন্ট করার চেয়ে কোনও ফাইলটিতে লগইন করা, উদাহরণস্বরূপ এর মতো কিছু ব্যবহার করা:

log() {
    printf '%s\n' "$@" > my.log
}

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


6

আপনি স্ট্যান্ডার্ড ত্রুটিতে তথ্য বার্তা উপস্থাপন করতে পারেন:

function FUNCTION() {
    local LOCAL="value"
    echo "$LOCAL"                      # return this variable
    echo "This function is done now" > /dev/stderr  # goes to the screen
}

কিছু অন্যান্য পরামর্শ এই লিনাক্স জার্নাল নিবন্ধে রয়েছে : গ্লোবাল ভেরিয়েবলগুলি ব্যবহার করুন (যা আপনি উল্লেখ করেছেন যে আপনি পছন্দ করেন না), বা ফলটি পরিবর্তন করতে ভেরিয়েবলের নামটি দিন।


/dev/stderrএফডি 2 পয়েন্ট এবং এখনও দ্বারা &>blahবা পুনঃনির্দেশিত করা যেতে পারে 2>blah/dev/ttyহয়ত ভাল.
আর্থার 2e5
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.