বাশ মানে এই অদ্ভুত প্রতীক ":>" এর অর্থ কী


47

আমি একটি স্ক্রিপ্টে কিছু পেয়েছি, তবে মূল স্ক্রিপ্টের অন্তর্গত নয়। ছিল :>একটি লাইন হবে।

আপনি কি আমাকে বোঝাতে পারছেন এর অর্থ?

:> file
while read A B C D E; do echo "$A;$B;$D;$E;$C" >> file; done < otherfile

6
গুরুত্বপূর্ণ, :>একক অপারেটর নয়। : > fileপরিবর্তে এটি পড়লে বোঝা সহজ হতে পারে ।
jpfx1342

এর মানে যে ব্যক্তি স্ক্রিপ্ট লেখার ফাইলে লুপ আউটপুট পুনঃনির্দেশিত করা উচিত ছিল: while read A B C D E; do echo "$A;$B;$D;$E;$C"; done < otherfile > file। বা আরও ভাল, তাদের কাজের জন্য সঠিক সরঞ্জামটি ব্যবহার করা উচিত ছিল, পিতরের পরামর্শ অনুসারে , ড । একপাশে হিসাবে, আপনি প্রায় সবসময় -rসঙ্গে স্যুইচ ব্যবহার করতে চানread
টম ফেনেক

বাশের বাইরে এটি একটি কাকের জন্য হাসিখুশি হবে।
স্মি

উত্তর:


46

ব্যাশ স্ক্রিপ্টের একটি লাইনে ছিল:> এর মানে কী?

:> file

এটি বলার একটি শর্ট কাট উপায়:

  • যদি fileঅস্তিত্ব না থাকে তবে এটি তৈরি করুন এবং এটিকে 0বাইটে ছাঁটাই করুন।

এর অর্থ আপনি নিশ্চিত থাকতে পারেন যে এটি fileবিদ্যমান এবং এটি খালি।

আপনি ব্যবহার করতে পারেন > fileতবে :> fileআরও বহনযোগ্য।

স্ট্যাক ওভারফ্লো প্রশ্নটি দেখুন : ':' (কোলন) জিএনইউ বাশ বিল্টিনের উদ্দেশ্য কী? আরও তথ্যের জন্য.


আমি দ্বিতীয় লাইন বুঝতে পারি না। আমি ভেবেছিলাম, যে পড়তে ভেরিয়েবল। কমান্ড প্রতিধ্বনিও আজব। আপনি ব্যাখ্যা করতে পারেন?
ডিয়েগো 9403

আমি ইউনিক্স বিশেষজ্ঞ নই তবে আমি মনে করি দ্বিতীয় লাইনটি জিনিসগুলি পড়ে otherfileএবং echoসেগুলি পাঠিয়ে দেয় file। এটি যা কিছু পড়ে তা থেকে পরিবর্তনশীলও তৈরি করে ... আপনি যদি একটি নির্দিষ্ট উত্তর চান তবে আপনার নিজের প্রশ্ন জিজ্ঞাসা করুন।
ডেভিডপস্টিল

2
@ ডিয়েগো9403: স্টিডিনের readকাছ থেকে ইনপুট পান। নিজে থেকে, এটি আপনি কী টাইপ করবেন তা পড়বে। যেহেতু স্টিডিনকে পুনঃনির্দেশিত করা হয়েছে <otherfileতখন এর সামগ্রীগুলি otherfileস্টিডিনে "টাইপ করা" হয়। সুতরাং readভ্যারিয়েবল $ A, $ B, $ C, $ D এবং $ E এর সাথে রেখাগুলি এক-এক-লাইন পায়।
slebetman

সুতরাং এটি truncateকোরিউটিল থেকে কেবল আরও একটি অস্পষ্ট বিকল্প ?
ফেডেরিকো পোলোনি

1
@ পিটারকর্ডস আমি "অস্পষ্ট" এর মতো "অস্পষ্ট" বলতে চাইনি, তবে "এটি পাঠকের পক্ষে কম স্পষ্ট"।
ফেডেরিকো পোলোনি

29

এটি একটি নতুন ফাইল তৈরির অভিনব উপায় বলে মনে হচ্ছে। ইন bash :একটি নাল কমান্ড:

$ type : 
: is a shell builtin 
$ help : 
:: :
    Null command.

    No effect; the command does nothing.

    Exit Status:
    Always succeeds.

>:একটি ফাইলের আউটপুট পুনঃনির্দেশ ।


2
এটি ইতিমধ্যে উপস্থিত থাকলে ফাইলটিও কেটে যাবে ...
ডেভিডপস্টিল

2
হ্যাঁ, এটি যা >করে
আরকাদিউস দ্রবকিজিক

2
:জন্য সাধারণভাবে সংক্ষেপে হয় true। সম্ভবত কিছু শেলের মধ্যে trueএকটি বিল্টিন না? দু'জনেই বিল্ট ইন বাশ।
পিটার কর্ডেস

12

:এর অন্য নাম true। উভয়ই বাশের শেল অন্তর্নির্মিত, তবে এখানে নেই /bin/:, কেবল একটি /bin/true। আউটপুট পুনর্নির্দেশের ফলে open(2)ফাইলটিতে শেল পড়ে O_CREAT|O_TRUNC। যদি কিছু না লেখা থাকে তবে এটি শূন্য দৈর্ঘ্যে থেকে যায়।

এই দুটি টুকরা একসাথে রাখা, :> fileফাইলগুলি কাটা করার জন্য মোটামুটি সাধারণ প্রতিমা i : >fileযদিও বেশিরভাগ লোকেরা লেখার মাধ্যমে এটিকে কম অদ্ভুত করে তোলার চেষ্টা করবেন ।


যেহেতু আপনি ২ য় লাইন সম্পর্কে একটি মন্তব্যে জিজ্ঞাসা করেছেন, তাই আমি আমার মন্তব্যগুলিকে উত্তরে পরিণত করব। (যদিও আপনি আপনার প্রশ্নে এটি জিজ্ঞাসা করেননি))

২ য় লাইনটি এমন একটি লুপ যা otherfileকিছু নামক ভেরিয়েবলের মধ্য থেকে লাইনগুলি পড়ে । লুপের বডি echoতাদের ;পূর্বে যেটি সাদা জায়গা রেখেছিল তার পরিবর্তে সেগুলি পৃথককারীগুলির সাথে মুদ্রণ করতে ব্যবহার করে । fileপ্রতিটি পুনরাবৃত্তি বন্ধ এবং পুনরায় খোলা হয় (সংযোজনের জন্য), কারণ পুনর্নির্দেশ লুপের ভিতরে is ব্যবহারের while ...;do read -r ...;done <otherfile >fileফলে কম স্তন্যপান হবে এবং প্রথমে ফাইল কেটে ফেলা দরকার avoid পালানোর চরিত্র হিসাবে read -rখায় না\

ব্যাশে পাঠ্য প্রক্রিয়াজাতকরণ বেশ ধীর। যে অংশ সম্পূর্ণরূপে এড়ানো সম্ভব নয়: readএকটা সময় (এক এক বাইট যেতে হবে read(2)বাইট প্রতি সিস্টেম কল) একটি লাইনের শেষে overshooting এড়ানো। কাজের জন্য সঠিক সরঞ্জামটি ব্যবহার করা ভাল:

awk -vOFS=';' '{ print $1, $2, $4, $5, $3 }' -- otherfile  >file

--মানে আপনার স্ক্রিপ্টটি ভেঙে যায় না যদি otherfileনির্বোধের মতো কিছু দেওয়া হয় --version

আউটপুট ক্ষেত্র বিভাজক সেট করার ;অর্থ আপনি মুদ্রণের জন্য আরগ হিসাবে কেবল একাধিক ক্ষেত্রগুলি পাস করতে পারেন। শেলটি readশেষ পর্বের সাদা অংশের সাথে পুরো লাইনের পুরো অংশটি নির্ধারিত করে, তবে কেবল মাত্র 5 টি বিভক্ত করার জন্য বিশ্রী বলার কোনও উপায় নেই that's এটি গুরুত্বপূর্ণ, সম্ভবত কেবল বাশ লুপটি ব্যবহার করা চালিয়ে যান কারণ এটি অসুবিধায় অসুবিধাজনক। পার্ল এটিকে সহজ করে তোলে, যেহেতু এটি splitএকটি সর্বাধিক ক্ষেত্রের আরগ নিতে পারে, তবে অ্যাজকের চেয়ে শুরু করা খুব ধীর।

প্রকৃতপক্ষে, এটি প্রমাণিত হয় যে শক্ত নয়, কেবল একটি কুরুচিপূর্ণ লেখাকে লিখতে হবে। $5অজকের পরিবর্তে বাকী-লাইনটি পেতে , ক্ষেত্রগুলিতে লুপিং করা এখনও তাদের আসল সাদা অংশটি হারাবে। আমার প্রথম কার্যক্ষম ধারণাটি হ'ল প্রথম পুরো ক্ষেত্রটি (অর্থাত্ স্পেস দ্বারা নির্ধারিত স্থান) অপসারণ করার জন্য (পুরো লাইনটি) ব্যবহার gensubকরা $0, এবং সমস্ত কিছু রেখে:

awk -vOFS=';' '{ tail = gensub("[[:space:]]*([^[:space:]]+[[:space:]]+){4}", "", 1); print $1, $2, $4, tail, $3 }' -- otherfile >file

আমি প্রথম চেষ্টাতেই পেয়েছিলাম, কিন্তু আমি যে সত্যের জন্য নিজেকে মুগ্ধ করেছিলাম তা এই অ্যাডকো কোডটির পঠনযোগ্যতা সম্পর্কে কিছু বলে। >। <

উল্লেখ্য কিভাবে এটি একই printআগের মতই, কিন্তু সঙ্গে tailস্থানে $5

echo 'A  B c DD    e      f g    f' | 
  awk -vOFS=\; '{ tail = gensub("[[:space:]]*([^[:space:]]+[[:space:]]+){4}", "", 1);
   print $1, $2, $4, tail, $3 }'

A;B;DD;e       f g    f;c

আমি যদি আক্ষরিক অনুলিপি / পেস্ট করতে পারি এবং এটি আউটপুটে এসেছিল তা দেখাতে পারি তবে এটি আরও চিত্তাকর্ষক হবে। Ash Q দিয়ে ব্যাশে একটি টাইপ করুন। সিটিআরএল-কিউ মানে পরবর্তী কিপ্রেসকে আক্ষরিক চরিত্র হিসাবে উদ্ধৃত করুন, যেহেতু বাশের ইমাক্স-স্টাইল লাইন সম্পাদনাটি এটির জন্য প্রকৃত ইম্যাক্সের সমান।

http://mywiki.wooledge.org/BashFAQ এ স্ক্রিপ্টিং সম্পর্কিত কিছু দরকারী জিনিস রয়েছে যা স্ক্রিপ্টে আপনি যে ডেটা বা ফাইলের নাম নিক্ষেপ করেন তা ভাঙ্গবে না।

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