লুপ আউটপুট জন্য পাইপিং স্থানীয় পরিবর্তনশীল পরিবর্তন প্রতিরোধ করে


11

আমি একটি সাধারণ বাশ ফাংশন লেখার চেষ্টা করছি যা এর আর্গুমেন্ট হিসাবে, বেশ কয়েকটি ফাইল এবং / বা ডিরেক্টরিতে লাগে। এটি করা উচিত:

  1. ফাইলের নামগুলি পুরোপুরি যোগ্যতা অর্জন করুন।
  2. তাদের বাছাই করুন।
  3. সদৃশ অপসারণ.
  4. বাস্তবে বিদ্যমান সমস্ত মুদ্রণ করুন।
  5. অস্তিত্বহীন ফাইলের সংখ্যা ফিরিয়ে দিন।

আমার কাছে একটি স্ক্রিপ্ট রয়েছে যা আমি যা চাই প্রায় তা করি তবে সাজানোর উপর পড়ে। স্ক্রিপ্টের যে পরিমাণটি দাঁড়িয়েছে তার মানটি সঠিক, তবে আউটপুট (অরসেটেড এবং সদৃশ) নয়। যদি আমি | sort -uনির্দেশিত হিসাবে বিবৃতিটিকে আপত্তিহস্ত করি তবে আউটপুট সঠিক তবে ফেরতের মান সর্বদা থাকে 0

সমস্যার সমাধান করার জন্য এনবি সরল সমাধানগুলি স্বাগত but তবে প্রশ্নটি আমার কোডটিতে কেন ঘটে চলেছে তা নিয়ে আসলেই প্রশ্ন। এটি হ'ল পাইপ যুক্ত করার ফলে স্ক্রিপ্টটি ভেরিয়েবলকে বাড়িয়ে দেওয়া কেন আপাতদৃষ্টিতে থামবে r?

লিপিটি এখানে:

function uniqfile
{
    local r=0 

    for arg in "$@"
    do  
        readlink -e "$arg" || (( ++r ))

    done #| sort -u    ## remove that comment

    return $r
}

শুধু একটি ছোট পর্যবেক্ষণ। আপনি হ্রাস for arg in "$@"করতে পারেন for arg। "যদি 'ওয়ার্ডস ইন ... ...' উপস্থিত নেই, তারপরে 'in "$ @"' ধরে নেওয়া হয়। " - সাহায্যের জন্য
manatwork

উত্তর:


15

এই সুপরিচিত ব্যাশ ফাঁদ, এই কারণে বৈশিষ্ট্য :

পাইপলাইনের প্রতিটি কমান্ড পৃথক প্রক্রিয়া হিসাবে (যেমন, একটি সাবসিলে) চালিত হয়।

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

এটি এড়াতে, কোনও প্রক্রিয়া প্রতিস্থাপন সহ পাইপলাইন এড়ানোর জন্য আপনার কোডটি পুনরায় লিখুন:

 for arg in "$@"
    do  
        readlink -e "$arg" || (( ++r ))

    done > >(sort -u)

ধন্যবাদ. দারুণ. আপনি যদি আমাকে >(..command..)নির্মাণের নাম বলতে পারতেন তবে আমি অবাক হই । আমি মনে করি এটি কীভাবে কাজ করে তা আমি জানি তবে আমার আরও কিছু পড়া উচিত feel
tjm

2
@ টিজেএম: এটিকে প্রক্রিয়া প্রতিস্থাপন
এনজোটিব

ব্যাশ মধ্যে প্রক্রিয়া প্রতিকল্পন নানা রূপে আছে: tldp.org/LDP/abs/html/process-sub.html
SLM

প্রক্রিয়া প্রতিস্থাপন হ'ল আন্ত-প্রক্রিয়া যোগাযোগের একটি রূপ যা কোনও আদেশের ইনপুট বা আউটপুটটিকে ফাইল হিসাবে উপস্থিত হতে দেয়। কমান্ডটি ইন-লাইনে প্রতিস্থাপন করা হয়, যেখানে একটি ফাইলের নাম সাধারণত কমান্ড শেল দ্বারা ঘটে থাকে । এটি এমন প্রোগ্রামগুলিকে অনুমতি দেয় যা সাধারণত অন্য ফাইল থেকে সরাসরি পড়তে বা লেখার জন্য কেবল ফাইলগুলি গ্রহণ করে।
নোবার

3

| sort -uবাহিনী পূর্ববর্তী বিট (তাই লুপ জন্য সম্পূর্ণ) একটি উপ-প্রক্রিয়া চালানোর জন্য (ব্যাশ মধ্যে পুনর্নির্দেশ করতে একটি 'stdout- এ চাহিদা sort' stdin '। (ইন্টারনেট মনে বলে মনে হয় kshএবং bashহ্যান্ডেল এই ক্ষেত্রে সামান্য ভিন্নভাবে .. প্রথম অথবা শেষ পাইপের অনুক্রমের কমান্ডটি একটি সাব-শেলের মধ্যে রাখে?)

এই থ্রেডটি একই ধরণের সমস্যার উপরে চলে যায় এবং শেষে একটি ঝরঝরে সমাধান রয়েছে: http://ubuntuforums.org/showthread.php?t=312017

উদ্ধৃতাংশ
    #!/bin/bash
    exec 3< <(du | sort -n)  

    n=0
    while read size dir; do
      [ $size -gt 1000 ] && ((n++))
    done <&3
    exec 3<&-

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