একাধিক কমান্ড সহ একটি শর্ত


0

এরকম কিছু করা কি সম্ভব?

if
rsync $folder/coopshop/prod $folder2/coopshop
rsync $folder/coopweb/prod $folder2/coopweb
rsync $folder/unihobbyshop/shop $folder2/unihobbyshop
rsync $folder/unnihobbyweb/web $folder2/unihobbyweb
then
  echo "OK! rsync done!"
else
  echo "Error! rsync crashed!"
fi

আমি জানি \রেখার শেষে চরিত্রটি করার একটি সম্ভাবনা রয়েছে তবে এটি বেশ মার্জিত সমাধান নয়। এই কাজ করতে একটি ভাল উপায় আছে কি?


সম্ভাব্য সদৃশ stackoverflow.com/questions/5130847/...
FedonKadifeli

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

2
ঠিক কী আচরণ আপনি চান? যদি rsyncকমান্ডগুলির মধ্যে একটি ব্যর্থ হয়, আপনি কি এটি বাকীটি চালনা করতে চান, বা ব্যর্থতা বন্ধ করতে চান? এছাড়াও, যদি কিছু rsyncসফল হয় এবং কিছু ব্যর্থ হয়, তবে এটি "ওকে" বা "ত্রুটি" প্রিন্ট করা উচিত?
গর্ডন ডেভিসন

@ গর্ডন ডেভিসন হ্যালো, একটি আদেশের ক্ষেত্রে যদি মিথ্যা হয়, তবে বার্তাটি মিথ্যা হবে। আমি মনে করি এই পরিবর্তনশীল কমান্ড দিয়ে কি সম্ভব কমান্ড = $ (কমান্ড) লিখুন দ্বারা বিভক্ত, এবং সহজভাবে সঙ্গে যদি ($ কমান্ড) । আমি পরীক্ষা করব এবং আপনাকে জানাবো।
স্টানিস্লাভ হোসেক

আপনার উদাহরণের শর্তের অংশটি ঠিক নেই .. এটি কেবলমাত্র rsync কমান্ডগুলি চালায় .. বা সিউডোকোড?
ব্যবহারকারী 688056

উত্তর:


4

বিবেচনা করুন set -e

যদি এটি কোনও স্ক্রিপ্টে থাকে, তবে আপনি সম্ভবত if... thenপুরোপুরি সরিয়ে ফেলতে চাইবেন এবং কেবল set -eস্ক্রিপ্টের শীর্ষে রাখবেন। এর ফলে কোনও কমান্ড ব্যর্থ হলে স্ক্রিপ্টটি সঙ্গে সঙ্গেই বন্ধ হয়ে যায় stop যখন এই rsyncকমান্ডগুলির মধ্যে কোনওটি ব্যর্থ হয়, তখন তারা ব্যর্থতার ব্যাখ্যা করে ত্রুটি বার্তা প্রদর্শন করবে, সুতরাং আপনাকে সম্ভবত নিজের বার্তা লেখার দরকার নেই।

আপনি যদি চালানোর আগে চালিত কমান্ডগুলি প্রদর্শন করতে চান তবে ব্যবহার করুন set -x। আপনি দুটি লিখে একত্রিত করতে পারেন set -ex

সাথে &&, আপনার দরকার নেই \

আপনি যদি যা দেখিয়েছেন সেটির লাইনে কিছু লিখতে সিদ্ধান্ত নেন, তবে রনি ব্লোমে যেমন বলেছেন আপনি কমান্ডগুলি এর সাথে আলাদা করতে পারেন &&। মনে রাখবেন যে, আপনি কমান্ড চালানোর জন্য প্রয়োজন হবে না subshells , অর্থাত্, আপনি না তাদের মধ্যে ঘিরা প্রয়োজন প্রথম বন্ধনী

আপনি যদি &&কোনও লাইনের শেষে অপারেটর লেখেন তবে \লাইন ধারাবাহিকতা নির্দিষ্ট করতে আপনাকে লেখার দরকার নেই । কোনও কমান্ড &&(লজিকাল ) বা ||(লজিকাল ওআর ) এ শেষ হতে পারে না যাতে শেলটি পরবর্তী লাইনে পার্স করা অবিরত থাকবে।

if
    rsync "$folder/coopshop/prod" "$folder2/coopshop" &&
    rsync "$folder/coopweb/prod" "$folder2/coopweb" &&
    rsync "$folder/unihobbyshop/shop" "$folder2/unihobbyshop" &&
    rsync "$folder/unnihobbyweb/web" "$folder2/unihobbyweb"
then
    echo 'OK! rsync commands completed successfully!'
else
    echo 'Error! some rsync command failed!'
fi

আপনাকে &&কোনও লাইনের শেষে রাখতে হবে না । আপনি চাইলে একই লাইনে একাধিক কমান্ড লিখতে &&পারেন।

নোট করুন যে পরীক্ষা করা হচ্ছে চূড়ান্ত কমান্ড শেষ হয় না &&কারণ কমান্ড && পৃথক করে। যদি কোনও কমান্ড ব্যর্থ হয়, অন্যগুলি চলবে না।

কিছু কমান্ড ব্যর্থ হলেও সমস্ত কমান্ড চালানো

পরিবর্তে আপনি সব চালাতে চান পারে rsyncকমান্ড এমনকি যদি তাদের কিছু ব্যর্থ, তারপর পরীক্ষা যদি কোনো তাদের ব্যর্থ হয়েছে এবং সেই অনুযায়ী কাজ করে। এই জন্য, আপনি ফাঁদ পেতে পারেন ERR। এটি প্রকৃত সংকেত নয়, তবে ERRব্যাশ-এর সিগন্যাল_স্পেক কমান্ডগুলি ক্যাচ করে যা কোনও ক্র্যাশ সহ (এবং সাইন ইন সহ) কোনও কারণে ব্যর্থ হয়। দেখুন pLumo এর উত্তর (কিন্তু বাদ set -eবর্তা) এবং উইলিয়াম Pursell দ্বারা পোস্টটি ; আরও সাধারণ তথ্যের জন্য, এর ফলাফল দেখুন help trap

আমি যেভাবে এটি করতে পছন্দ করি (আপনার প্লাগ ইন করার মতো কমান্ড সহ):

failed=
trap 'failed=yes' ERR

rsync "$folder/coopshop/prod" "$folder2/coopshop"
rsync "$folder/coopweb/prod" "$folder2/coopweb"
rsync "$folder/unihobbyshop/shop" "$folder2/unihobbyshop"
rsync "$folder/unnihobbyweb/web" "$folder2/unihobbyweb"

if [ -z "$failed" ]; then
    echo 'OK! rsync commands completed successfully!'
else
    echo 'Error! some rsync command failed!'
fi

আমি যে অন্যান্য পরিবর্তনগুলি করেছি ... এবং সত্যই কি পরীক্ষা করে Aboutif command

আপনার যুক্তিগুলি প্যারামিটার সম্প্রসারণটিrsync ব্যবহার করার জন্য তাই আমি সেগুলি ডাবল-কোট করার স্বাধীনতা নিয়েছি । অন্যথায় শব্দ বিভাজন এবং গ্লোববিং সম্পাদন করা হবে। প্রসঙ্গ থেকে এটি প্রদর্শিত হয় আপনি এই অতিরিক্ত বিস্তৃতি চান না। ( সাধারণত আপনি না। )

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


আমি ভুলতে প্রস্থান ছাড়াই ফাঁদ ব্যবহার পছন্দ করি। এটি সম্পর্কে কখনই ভাবিনি :-) আমি ব্যবহার করতাম তবে rsync ... || failed=yesফাঁদটি আরও মার্জিত।
pLumo

"যদি / তারপর / অন্য" বাশ ব্যতীত অন্য কোনও কিছুর মতো অনুভব করে। আপনি সিনট্যাক্স যেমন: বিবেচনা করতে পারেন [ -z $failed ] && echo "OK" || echo "Error"
রে বাটারওয়ার্থ

1
@ রেবুটারওয়ার্থ ifসাধারণত ব্যাশে ব্যবহৃত হয় এবং ভয় করা উচিত নয়। আপনি ভুল হিসাবে এটি তিনবারের শর্তসাপেক্ষ হিসাবে ব্যবহার না বিবেচনা করতে পারেন a && b || cএমনকি echoলেখার ত্রুটিতে ব্যর্থ হতে পারে, এর মতো >/dev/full; এমনকি এটি অপ্রত্যাশিতভাবে ঘটতে পারে। এমনকি যখন bব্যর্থ হতে পারে না, এটি পরীক্ষা করে ভুল ধারণা প্রকাশ করে। আমি বিবেচনা করি না &&এবং ||যখন আমি একক-শাখা ifগুলি লিখি । a && bজন্য if a; then b; fiএবং এর a || bজন্য if ! a; then b; fiপ্রায়শই যুক্তিসঙ্গত, যদিও এটি সম্পূর্ণ সমতুল্য নয় ( ifযখন তার শর্তটি ব্যর্থ হয় তখন সফল হয়)।
এলিয়াহ কাগন

2

আপনার মতো স্ক্রিপ্টের জন্য, আমি if/ ব্যবহার করব না else, তবে ত্রুটি ( set -e) এবং ট্র্যাপিংয়ের প্রস্থানটি সক্ষম করব ।

এটার মতো কিছু:

#!/bin/bash

set -euo pipefail
trap 'echo "Error! rsync crashed!"' ERR INT

rsync $folder/coopshop/prod $folder2/coopshop
rsync $folder/coopweb/prod $folder2/coopweb
rsync $folder/unihobbyshop/shop $folder2/unihobbyshop
rsync $folder/unnihobbyweb/web $folder2/unihobbyweb

echo "OK! rsync done!"

এটি তালিকাবদ্ধ করা প্রয়োজন INT? আমি বিশ্বাস করি যে ERRসমস্ত ক্ষেত্রে শেলটি অস্বাভাবিক প্রোগ্রামের সমাপ্তি সনাক্ত করে, সাধারণ প্রোগ্রাম সমাপ্তির ক্ষেত্রে এছাড়াও কমান্ডকে নানজারো প্রস্থান স্থিতির কারণ হিসাবে চিহ্নিত করে covers (আমি চালিয়ে এই পরীক্ষিত থাকেন trap 'echo "trap triggered"' ERRএকটি দম্পতি রানে অনুসৃত sleep 10সময় আমি পাঠাতে sleep। প্রক্রিয়া SIGINT কিনা SIGINT টার্মিন্যালে বা জন্য Ctrl + সি টিপে পাঠানো হয় killall -INT sleepঅন্য টার্মিন্যালে, বার্তা ছাপা হয়।)
Eliah মধ্যে Kagan

সম্ভবত ঠিক, আমি পরীক্ষা করিনি, "এই জাতীয় কিছু" "ও দেখুন, তাই বিচ্যুতি অনুমোদিত, এবং আপনি আপনার উত্তরে একটি ভাল উপহার দিন।
pLumo

1

এই বাক্য গঠন চেষ্টা করুন:

#!/bin/bash
mkdir dir1 dir2
echo "test1" > dir1/file1
echo "test2" > dir1/file2

if (rsync dir1/file1 dir2) && (rsync dir1/file2 dir2) 
then
  echo "OK! rsync done!"
else
  echo "Error! rsync crashed!"
fi

আরও ভাল রনি! আমার কাছ থেকে +1 (সিসি @ মেলিবিয়াস) ;-)
ফাব্বি

-1

আমি এই চেষ্টা করেছিলাম।

commands=$(
mkdir 1
mkdir 2
)

if($commands); then
  echo 'Ok.'
else
  echo 'False.'
fi

এটা কাজ করে। সমস্যাটি যখন আমি উদাহরণস্বরূপ ls -la কমান্ডগুলিতে যুক্ত করি, এটি এটির সাথে ব্যর্থ হয়েছিল।

./test: line 7: total: command not found

কেন জানি না।


2
এটি কাকতালীয়ভাবে কাজ করতে পারে তবে এটি আপনার প্রশ্নের সমাধান নয়। অংশটি commands=$(...)কমান্ডগুলির স্ট্যান্ডার্ড আউটপুট সংগ্রহ করে। অংশটি পাঠ্য আউটপুটকে কমান্ড হিসাবেif($commands) ব্যবহার করার চেষ্টা করছে যা সাধারণত একটি ভুল ধারণা।
ম্লেবিয়াস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.