আপনি কি আমার জন্য এই ব্যাশ কোডে এই তিনটি জিনিস ব্যাখ্যা করতে পারেন?


10

আমি একটি আছে functionআমার মধ্যে .bashrcফাইল। আমি জানি এটি কী করে, এটি এক্স দ্বারা বহু ডিরেক্টরিকে ধাপে ধাপে নিয়ে যায়cd

এটা এখানে:

up()
{
    local d=""
    limit=$1
    for ((i=1 ; i <= limit ; i++))
      do
        d=$d/..
      done
    d=$(echo $d | sed 's/^\///')
    if [ -z "$d" ]; then
      d=..
    fi
    cd $d
}

তবে আপনি কি এই তিনটি বিষয় আমার জন্য ব্যাখ্যা করতে পারেন?

  1. d=$d/..
  2. sed 's/^\///'
  3. d=..

কেন শুধু এইভাবে করবেন না:

up()
{
    limit=$1

    for ((i=1 ; i <= limit ; i++))
    do
        cd ..
    done
}

ব্যবহার:

<<<>>>~$ up 3
<<<>>>/$

উত্তর:


24
  1. d=$d/..ভেরিয়েবলের /..বর্তমান সামগ্রীতে যুক্ত হয় ddখালি শুরু হয়, তারপরে প্রথম পুনরাবৃত্তি এটি করে তোলে /.., দ্বিতীয় /../..ইত্যাদি

  2. sed 's/^\///'প্রথমটি ড্রপ করে /, তাই /../..হয়ে যায়  ../..(এটি একটি প্যারামিটার সম্প্রসারণ ব্যবহার করে করা যেতে পারে d=${d#/})।

  3. d=.. শুধুমাত্র তার অবস্থার প্রসঙ্গে অর্থবোধ করা যায়:

    if [ -z "$d" ]; then
      d=..
    fi
    

    এটি নিশ্চিত করে যে, যদি dএই মুহুর্তে খালি থাকে তবে আপনি প্যারেন্ট ডিরেক্টরিতে যান। ( upকোন যুক্তি সহ সমতুল্য নয় cd ..)

এই পদ্ধতির পুনরাবৃত্তির চেয়ে ভাল cd ..কারণ এটি সংরক্ষণ করে cd -- এক ধাপে পূর্ববর্তী ডিরেক্টরিতে (ব্যবহারকারীর দৃষ্টিকোণ থেকে) ফিরে আসার ক্ষমতা।

ফাংশনটি সরল করা যায়:

up() {
  local d=..
  for ((i = 1; i < ${1:-1}; i++)); do d=$d/..; done
  cd $d
}

এটি ধরে নেওয়া হয় যে আমরা কমপক্ষে একটি স্তর উপরে উঠতে চাই এবং n - 1 স্তর যুক্ত করি, তাই আমাদের শীর্ষস্থানীয় সরাতে /বা খালি খালি পরীক্ষা করার দরকার নেই $d

অ্যাথেনা jot( দেবিয়ান athena-jotপ্যাকেজ) ব্যবহার করে:

up() { cd $(jot -b .. -s / "${1:-1}"); }

( গ্লেন জ্যাকম্যান প্রস্তাবিত বৈকল্পিকের ভিত্তিতে )।


হ্যাঁ, $OLDPWDপদদলিত হয়ে মাথায় এলো। এবং cdড্রেস্ট্যাক ব্যবহার করার জন্য সেট সহ zsh এ , এটিও।
মুড়ু

কেবলমাত্র লুপটি ব্যবহারের পরিবর্তে বরাদ্দ $1দেওয়ার কোনও কারণ আছে ? limit$1
নিক মাতেও

1
@ কুন্ডর এটি ডিফল্ট 0 টি নিশ্চিত করে ( শেল গাণিতিক দেখুন )। আমরা ${1:-1}পরিবর্তে ব্যবহার করতে পারি, গ্লেনের বৈকল্পিকের মতো।
স্টিফেন কিট

@ কুন্ডর এছাড়াও মানব পাঠযোগ্যতা। একটি সু-নামে পরিবর্তনশীল আপনি বলে কি উদ্দেশ্যে অর্থ বা উদ্দেশ্য প্রথম যুক্তির হয় যখন আপনি শুরু এটা অনুমান করতে কোড বুঝতে প্রথম জানা ফাংশন কি করে বা ফিনিস করেও ফাংশন পড়া।
mtraceur

2

তবে আপনি কি এই তিনটি বিষয় আমার জন্য ব্যাখ্যা করতে পারেন?

  1. D = $ d টি / ..

    এটি এর সাথে উপস্থিত বিভিন্ন সামগ্রীর dসাথে সম্মতি জানায় /..এবং এটিকে আবার নির্ধারণ করে d
    শেষ ফলাফলটি dপুনরাবৃত্ত স্ট্রিংয়ের মতো করা /../../../..

  2. সেড 's / ^ ///'

    আপনার পোস্ট করা কোডটিতে /সরবরাহ করা স্ট্রিং থেকে d(ইকো $ ডি) অগ্রণী সরিয়ে দিন । ব্যাকস্ল্যাশ এড়ানোর জন্য
    সম্ভবত আরও ভাল লেখা sed 's|^/||'

    একটি বিকল্প (দ্রুত এবং সহজ) লিখতে হয় d=${d#/}

  3. D = ..

    স্ট্রিং ধার্য ..Var এর d
    এটি পরীক্ষার সিগন্যালগুলিতে ভেরি ফাঁকা থাকার ক্ষেত্রে dকমপক্ষে একটি রয়েছে তা নিশ্চিত করার উপায় হিসাবে এটি বোধগম্য হয় । এবং এটি কেবলমাত্র ঘটতে পারে কারণ সেড কমান্ড একটি অক্ষর থেকে মুছে ফেলছে । ডি থেকে চরিত্রটি অপসারণ করার প্রয়োজন না হলে, বা প্রয়োজন নেই ।..if [ -z "$d" ]; thendd
    sedif


আপনার প্রশ্নের কোড সর্বদা কমপক্ষে একটি দির উপরে চলে যাবে।

উত্তম

  • local dভেরিয়েবলটি খালি রয়েছে তা নিশ্চিত করার জন্য যথেষ্ট, অন্য কিছুই প্রয়োজন নেই।
    তবে স্থানীয় বাশ বা ড্যাশের মতো কয়েকটি শেলের মধ্যে স্থানীয় কাজ করে। নির্দিষ্টভাবে, ksh(যেমন yash) এর কোনও localআদেশ নেই। আরও একটি বহনযোগ্য সমাধান:

    [ "$KSH_VERSION$YASH_VERSION" ] && typeset c='' d='' i='' || local c='' d='' i=''
  • for((সিনট্যাক্স পোর্টেবল নয়। এর মতো আরও ভাল ব্যবহার:

    while [ "$((i+=1))" -lt "$limit" ]; do
  • বলিষ্ঠ.
    যদি প্রথম আর্গুমেন্টে প্রদত্ত মানগুলি negativeণাত্মক বা পাঠ্য হতে পারে তবে এই মানগুলি প্রক্রিয়া করার জন্য ফাংশনটি শক্তিশালী হওয়া উচিত।
    প্রথমে মানগুলি কেবলমাত্র সংখ্যায় সীমাবদ্ধ রাখুন (আমি এর cজন্য ব্যবহার করব count):

    c=${1%%[!0-9]*}

    এবং তারপরে গণনা মানটি কেবল ইতিবাচক মানগুলিতে সীমাবদ্ধ করুন:

    let "c = (c>0)?c:0"

এই ফাংশনটি 0 বা কোনও পাঠ্য (ত্রুটি ছাড়াই) কড়াভাবে গ্রহণ করবে:

up()
{
    [ "$KSH_VERSION$YASH_VERSION" ] && typeset c='' d='' i='' || local c='' d='' i=''
    c=${1%%[!0-9]*}
    c=$(((c>0)?c:0))
    while [ "$((i+=1))" -le "$c" ]; do d="$d../"; done
    echo \
        cd "${d%/}"         # Removing the trailing / is not really needed for cd
                            # but it is nice to know it could be done cleanly.
}

up 2
up 0
up asdf

echo \আপনি যখন ফাংশনটি পরীক্ষা করেছেন তখন সরিয়ে ফেলুন ।

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