Best ব্যবহারের সেরা অনুশীলন? বাশে?


10

আমি কখন এই উত্তরটি read সম্পর্কে পড়ি ? আরেকটি প্রশ্ন মাথায় আসে।

কীভাবে use ব্যবহার করবেন তার জন্য কোনও সেরা অনুশীলন আছে? বাশে?


আসুন একটি উদাহরণ দেওয়া যাক:

আমাদের একটি রৈখিক স্ক্রিপ্ট রয়েছে এবং আমি জানতে চাই যে সমস্ত কমান্ড ঠিকঠাকভাবে কার্যকর হয়েছিল। আপনি কি মনে করেন যে একটি ছোট ফাংশন কল করা ঠিক আছে (আসুন এটিকে "did_it_work" বলুন), ত্রুটি কোডটি পরীক্ষা করে এটি যদি না হয় তবে ব্রেক করুন।

#!/bin/bash 

function did_it_work {
    code=$1
    if [ "$code" -ne "0" ]
    then
        echo "Error failure: code $code "
        exit 1
    fi
}

dir=some/path

mkdir -p $dir
did_it_work $? 

cd $dir
did_it_work $? 

run_some_command
did_it_work $? 

অবশ্যই এই পদ্ধতির অর্থ হ'ল আমাকে যদি কোনও সমস্যা থাকে তবে ম্যানুয়ালি সমাধান করতে হবে এবং স্ক্রিপ্টটি পুনরায় চালু করতে হবে।

আপনি কি মনে করেন এটি একটি ভাল ধারণা বা এটি করার জন্য অন্য কোনও সেরা অনুশীলন রয়েছে?

/ ধন্যবাদ

উত্তর:


15

একটি সাধারণ উপায় হ'ল:

die() {
    IFS=' ' # make sure "$*" is joined with spaces

    # output the arguments if any on stderr:
    [ "$#" -eq 0 ] || printf '%s\n' "$*" 1>&2
    exit 1
}

তারপরে আপনি এটি ব্যবহার করুন:

mkdir -p some/path || die "mkdir failed with status $?"

অথবা আপনি যদি প্রস্থান স্থিতি অন্তর্ভুক্ত করতে চান তবে আপনি এটিকে পরিবর্তন করতে পারেন:

die() {
    last_exit_status=$?
    IFS=' '
    printf '%s\n' "FATAL ERROR: $* (status $last_exit_status)" 1>&2
    exit 1
}

এবং তারপরে এটি ব্যবহার করা কিছুটা সহজ:

mkdir -p some/path || die "mkdir failed"

এটি ব্যর্থ হলে, mkdirসম্ভবত ইতিমধ্যে একটি ত্রুটি বার্তা জারি করেছে, যাতে দ্বিতীয়টি রিডানড্যান্ট হিসাবে দেখা যেতে পারে এবং আপনি ঠিক করতে পারেন:

mkdir -p some/path || exit   # with the same (failing) exit status as mkdir's
mkdir -p some/path || exit 1 # with exit status 1 always

(বা dieতর্ক ছাড়াই উপরে প্রথম রূপটি ব্যবহার করুন )

আপনি যদি command1 || command2আগে না দেখে থাকেন তবে এটি চলে command1এবং যদি command1ব্যর্থ হয় তবে এটি চলে command2

সুতরাং আপনি এটি "ডিরেক্টরি তৈরি করুন বা মরা" এর মতো পড়তে পারেন।

আপনার উদাহরণটি দেখতে হবে:

mkdir -p some/path || die "mkdir failed"
cd some/path || die "cd failed"
some_command || die "some_command failed"

অথবা আপনি diesডানদিকে আরও প্রান্তিককরণ করতে পারেন যাতে মূল কোডটি আরও স্পষ্ট হয়।

mkdir -p some/path         || die "mkdir failed"
cd some/path               || die "cd failed"
some_command               || die "some_command failed"

অথবা নিম্নলিখিত লাইনে কমান্ড লাইনগুলি দীর্ঘ হলে:

mkdir -p some/path ||
  die "mkdir failed"

cd some/path ||
  die "cd failed"

some_command ||
  die "some_command failed"

এছাড়াও, আপনি যদি নামটি some/pathএকাধিকবার ব্যবহার করতে চলেছেন তবে এটিকে একটি ভেরিয়েবলে সংরক্ষণ করুন যাতে আপনার এটি টাইপ করতে না হয় এবং আপনার প্রয়োজনে সহজেই এটি পরিবর্তন করতে পারেন। এবং কমান্ডগুলিতে ভেরিয়েবল আর্গুমেন্টগুলি পাস করার সময়, --অপশনটি ডিলিমিটারটি ব্যবহার করার বিষয়টি নিশ্চিত করুন যাতে আর্গুমেন্টটি যদি এটি শুরু হয় তবে কোনও বিকল্প হিসাবে নেওয়া হবে না -

dir=some/path
mkdir -p -- "$dir"         || die "Cannot make $dir"
cd -P -- "$dir"            || die "Cannot cd to $dir"
some_command               || die "Cannot run some_command"

9

আপনি নিজের কোডটি আবার লিখতে পারেন:

#!/bin/bash
function try {
    "$@"
    code=$?
    if [ $code -ne 0 ]
    then
        echo "$1 did not work: exit status $code"
        exit 1
    fi
}

try mkdir -p some/path
try cd some/path
try run_some_command

যদি আপনার আসলে ত্রুটি কোডটি লগ করার প্রয়োজন না হয় তবে কমান্ডটি সফল হয়েছে কিনা, আপনি try()আরও এভাবে সংক্ষেপিত করতে পারেন :

function try {
    if ! "$@"
    then
        echo "$1 did not work"
        exit 1
    fi
}

আপনি এই বিন্যাসে কোড ব্যবহার করতে পারেন। <pre> ফাংশনটি চেষ্টা করুন {
বিলথোর

আপনি যদি এই কার্যকারিতাটি ইনলাইন ব্যবহার করেন এবং সত্য দিক থেকে ফিরে আসতে না চান তবে আপনি বিল্টিন return $?দিয়ে প্রতিস্থাপন করতে পারেন :
বিলথোর

8

আপনি যদি সত্যিই exitকোনও ত্রুটি করতে চান এবং ব্যাশ ব্যবহার করে থাকেন তবে আপনারও বিবেচনা করা উচিত set -e। থেকে help set:

-মানের শূন্য-স্থিতি স্থিতি সহ একটি আদেশ উপস্থিত থাকলে অবিলম্বে প্রস্থান করুন।

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


set -eদরকারী. কিছু কমান্ড রয়েছে যা সাধারণ পরিস্থিতিতে অ-শূন্য ফিরে আসে (উদাহরণস্বরূপ, diff)। যখন আমি কোনও স্ক্রিপ্টে সেট-ই ব্যবহার করি যেখানে আমি ননজারো প্রত্যাবর্তনের প্রত্যাশা করি, আমি তা করি command || true
শন জে গোফ

2
তদতিরিক্ত, এমনকি যদি আপনি ব্যবহার করেন তবে আপনি set -eসমস্ত ত্রুটিগুলি ধরতে একটি "ব্যতিক্রম হ্যান্ডলার" সেট করতে পারেন trap did_it_work EXIT
গিলস 18:41-

1
এটি পশিক্সের অংশ, কোনও ব্যাশ নির্দিষ্ট বৈশিষ্ট্য নয়। এটি ব্যবহার করুন তবে কিছু সমস্যা সম্পর্কে সচেতন হন mywiki.wooledge.org/BashFAQ/105
কিমিপ্যাপ্লান

@ শনজে.ওফ আমি করতে পছন্দ করি command && true। রিটার্নের মান পরিবর্তন হয় না
কিমিপ্যাপ্লান

@kmkaplan আপনার শেষ মন্তব্যটি আমার কাছে কোনও অর্থ দেয় না। এর উদ্দেশ্য command || trueহ'ল set -eস্ক্রিপ্টটি প্রস্থান করা থেকে বিরত রাখা যদি commandকোনও শূন্য-বহির্গমন কোড দেয়। এটি প্রস্থান কোড পরিবর্তন করে কারণ আমাদের প্রয়োজন। কেবলমাত্র command && trueচালানো হয় true(একটি শূন্য প্রস্থান কোড ফেরান) যদি `কমান্ড সফল হয় (একটি শূন্য প্রস্থান কোডটি ফেরত পাঠিয়েছে) - এটি সম্পূর্ণ নো-ওপেন।
ট্রিপলি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.