আইএফ স্টেটমেন্ট ব্যবহার করার সময় আমি কীভাবে একাধিক লাইনের উপরে শেল কমান্ড বিভক্ত করতে পারি?


384

কমান্ডটি যখন কোনও ifবিবরণের অংশ হয় তখন আমি কীভাবে শেলটির একাধিক লাইনের উপরে একটি কমান্ড বিভক্ত করতে পারি ?

এইটা কাজ করে:

if ! fab --fabfile=.deploy/fabfile.py --forward-agent --disable-known-hosts deploy:$target; then rc=1                                                                       
fi

এটি কাজ করে না:

# does not work:
if ! fab --fabfile=.deploy/fabfile.py \ 
  --forward-agent \
  --disable-known-hosts deploy:$target; then   
  rc=1
fi

সম্পূর্ণ কমান্ড কার্যকর করার পরিবর্তে, আমি পাই:

./script.sh: line 73: --forward-agent: command not found

আরও গুরুত্বপূর্ণ বিষয়, আমার বাশ সম্পর্কে আমার বোঝার থেকে কী অনুপস্থিত যা ভবিষ্যতে এই এবং এই জাতীয় বিষয়গুলি বুঝতে আমাকে সহায়তা করবে?


2
ত্রুটি কী? আমি $ if ! cp -n log/server1.log \ > .; then echo no copy; fiত্রুটি ছাড়াই এক্সিকিউট করতে সক্ষম হলাম , এর পরে একটি নতুন লাইন দিয়ে\
খের পরিবর্তনশীল

15
টার্মিনাল ব্যাকস্ল্যাশগুলির পরে আপনার কি ফাঁকা জায়গা রয়েছে \ ? তারা দেখতে বেশ কঠিন। যদি আপনি তা করেন তবে আপনি দেখতে চাইতে পারেন যে আপনি নিজের সম্পাদককে হয় অনুসরণের স্থানগুলি সরিয়ে ফেলতে পারেন বা আরও দৃশ্যমান করে তুলতে পারেন।
এমএসডাব্লু

10
হ্যাঁ, এটি টার্মিনাল ব্যাকস্ল্যাশগুলির পরে ফাঁকা স্থান ছিল। পুরোটাই। ধন্যবাদ.
দিমিত্রি মিনকভস্কি

এবং হ্যাঁ, দুঃখিত, আমার "ত্রুটি" পোস্ট করা উচিত (অপ্রত্যাশিত ফলাফল)! আমার খারাপ! এখন সম্পাদনা করা হচ্ছে।
দিমিত্রি মিনকভস্কি

আপনার বোঝা কি ছিল? এটিও প্রশ্নের অংশ নয়।
hakre

উত্তর:


566

ব্যাকস্ল্যাশ পরে এবং নতুন লাইনের আগে যদি আপনার শ্বেত স্পেস (স্পেস বা ট্যাব অক্ষর) থাকে তবে লাইন-ধারাবাহিকতা ব্যর্থ হবে। এ জাতীয় কোনও সাদা স্থান নেই, আপনার উদাহরণটি আমার পক্ষে ভাল কাজ করে:

$ cat test.sh
if ! fab --fabfile=.deploy/fabfile.py \
   --forward-agent \
   --disable-known-hosts deploy:$target; then
     echo failed
else
     echo succeeded
fi

$ alias fab=true; . ./test.sh
succeeded
$ alias fab=false; . ./test.sh
failed

মন্তব্যগুলি থেকে কিছু বিশদ প্রচারিত: শেলটিতে লাইন-ধারাবাহিকতা ব্যাকস্ল্যাশটি আসলেই বিশেষ কোনও বিষয় নয়; এটি কেবল সাধারণ নিয়মের একটি উদাহরণ যা কোনও ব্যাকস্ল্যাশ তত্ক্ষণাত্ নীচের চরিত্রটিকে "উদ্ধৃত করে", কোনও বিশেষ চিকিত্সা রোধ করে যা সাধারণত এটির অধীন হতে পারে। এই ক্ষেত্রে, পরবর্তী অক্ষরটি একটি নতুন লাইন, এবং যে বিশেষ চিকিত্সা প্রতিরোধ করা হচ্ছে তা হ'ল আদেশটি সমাপ্ত করা। সাধারণত, একটি উদ্ধৃত অক্ষর বায়ু আপ কমান্ড আক্ষরিক অন্তর্ভুক্ত; পরিবর্তে একটি ব্যাকস্ল্যাশড নিউলাইন পুরোপুরি মুছে ফেলা হয়। তবে অন্যথায়, প্রক্রিয়াটি একই। এবং ব্যাকস্ল্যাশ কেবল তাত্ক্ষণিকভাবে নিম্নলিখিত বর্ণনাকে উদ্ধৃত করে; যদি সেই চরিত্রটি কোনও স্থান বা ট্যাব হয় তবে আপনি কেবল একটি উদ্ধৃত স্থান বা ট্যাব পাবেন এবং পরবর্তী কোনও নতুন লাইন অব্যক্ত থাকবে।


5
মার্ক, আপনি জানেন, আমার অবশ্যই সাদা জায়গা থাকতে হবে। আমি শুধু ত্রুটি পুনর্গঠন করা যখন পর অনুসরণকারী শূণ্যস্থান যোগ সক্ষম `s. For example, when adding one after the first `, আমি পেতে ./soundops: line 73: --forward-agent: command not found। আমার সমস্যাগুলি হ'ল আমি এই ত্রুটিটি বুঝতে পারি নি। কেন একটি সাদা জায়গা থাকার ফলে ত্রুটি হয়? শ্বেতস্থান + \nthe "কে" উপেক্ষা করে "এবং একটি আদেশ সীমাবদ্ধ করে?
দিমিত্রি মিনকভস্কি

83
নিউলাইনটির সামনে একটি ব্যাকস্ল্যাশ কমান্ডটি শেষ করা থেকে নতুন লাইনের প্রতিরোধ করে। তবে "\ n" এর মতো বিশেষ পালানোর অনুক্রমগুলি কেবল ব্যাকস্ল্যাশ এবং এন এর মধ্যে কিছুই না করে কাজ করে, ব্যাকস্ল্যাশ-নিউলাইন কেবল ব্যাকস্ল্যাশ এবং নতুন লাইনের মধ্যে কিছুই না করে কাজ করে।
মার্ক রিড

18
হাহাহাহা বাহ, অবশ্যই তা বোধগম্য হয়। কখনও সেভাবে দেখেনি। চোখ খোলা, তবুও সহজ: এটি কেবলমাত্র একটি পালানো নিউলাইন। আমি অদৃশ্য চরিত্রগুলিকে ঘৃণা করি। তারা যদি কেবলমাত্র দৃশ্যমান হয় তবে তারা আমার কাছে আরও অনেক কিছু বোঝাতে চাইবে। ধন্যবাদ!
দিমিত্রি মিনকভস্কি

7
বেশিরভাগ সম্পাদকগুলিতে আপনি সেই অদৃশ্য অক্ষরগুলি দৃশ্যমান করতে পারেন।
lucasvc

1
ব্যাকস্ল্যাশ এবং নিউলাইন কার্যকর কমান্ড লাইন থেকে মুছে ফেলা হয়, তবে পরবর্তী লাইনে যে কোনও শীর্ষস্থানীয় সাদা স্থান সংরক্ষণ করা হয়। সুতরাং এটি সমস্যা কিনা বা না তা নির্ভর করে একক-লাইন কমান্ডের সেই সময়ে সাদা স্থান কোনও সমস্যা হবে কিনা would
মার্ক রিড

52

উইন্ডোজ / ডাব্লুএসএল / সাইগউইন ইত্যাদি ব্যবহারকারীদের জন্য:

আপনার লাইনের সমাপ্তিগুলি মানক ইউনিক্স লাইন ফিডগুলি, অর্থাত্ \n(এলএফ) কেবল তা নিশ্চিত করুন।

উইন্ডোজ লাইন এন্ডিংস \r\n(সিআরএলএফ) লাইন এন্ডিং ব্যবহার করলে কমান্ড লাইন ব্রেকটি ভেঙে যাবে।


এটি কারণ \উইন্ডোজ লাইনের সাথে শেষ হওয়ার সাথে সাথে একটি লাইনের শেষে অনুবাদ হয় \ \r \n
যেমন মার্ক উপরে সঠিকভাবে ব্যাখ্যা করেছে:

আপনার যদি ব্যাকস্ল্যাশ পরে এবং নতুন লাইনের আগে সাদা জায়গা থাকে তবে লাইন-ধারাবাহিকতা ব্যর্থ হবে।

এটিতে কেবল স্থান ( ) বা ট্যাবগুলি ( \t) নয় বরং ক্যারেজ রিটার্ন ( \r) অন্তর্ভুক্ত রয়েছে।


1
এটি উইন্ডোজে স্ক্রিপ্ট তৈরি করার সময় এবং তারপরে এটি উইন্ডোজ ব্যাশে ব্যবহার করার সময় তৈরি হওয়া সমস্যার সমাধান করে (উদাহরণস্বরূপ bash -c MyShellScript.sh যেখানে উইন্ডোজ সম্পাদকে MyShellScript.sh তৈরি হয়েছিল)। ইউএনএক্স ফর্ম্যাটে আপনাকে নোটপ্যাড ++ ব্যবহার করে আপনাকে মাইশেলস্ক্রিপ্ট.শ সংরক্ষণ করতে হবে।
BSalita
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.