কোলন বিল্টিন কী উদ্দেশ্যে কাজ করে?


45

আমি প্রচুর শেল স্ক্রিপ্ট হ্যাক করেছি এবং কখনও কখনও সিম্পল জিনিস আমাকে অবাক করে দেয়। আজ আমি একটি স্ক্রিপ্ট জুড়ে দৌড়েছি যা :(কোলন) বাশ বিল্টিনের বিস্তৃত ব্যবহার করেছে ।

Documenation সহজ যথেষ্ট বলে মনে হয়:

: (a colon)  
     : [arguments]  

যুক্তিগুলি প্রসারিত করা এবং পুনর্নির্দেশগুলি সম্পাদনের বাইরে কিছু করবেন না। ফেরতের অবস্থা শূন্য।

তবে আমি এর আগে কেবল শেল প্রসারণের বিক্ষোভগুলিতে এটি ব্যবহার করে দেখেছি। আমি যে স্ক্রিপ্টটিতে এসেছি তার ব্যবহারের ক্ষেত্রটি এই কাঠামোর ব্যাপক ব্যবহার করেছে:

if [ -f ${file} ]; then
    grep some_string ${file} >> otherfile || :
    grep other_string ${file} >> otherfile || :
fi

আসলে শত শত গ্রেপ ছিল, তবে সেগুলি কেবল একই রকম more উপরের সাধারণ কাঠামো ব্যতীত কোনও ইনপুট / আউটপুট পুনর্নির্দেশগুলি উপস্থিত নেই। স্ক্রিপ্টে কোনও ফেরতের মান চেক করা হয় না।

আমি এটি অকেজো কনস্ট্রাক্ট হিসাবে পড়ছি যা "বা কিছুই করবে না" বলে। "বা কিছুই না" দিয়ে এই গ্রেপ্তারগুলি শেষ করার কী উদ্দেশ্য রয়েছে? কোন ক্ষেত্রে এই নির্মাণটি কেবল || :সমস্ত দৃষ্টিকোণ থেকে সরে যাওয়ার চেয়ে আলাদা ফলাফলের কারণ হতে পারে ?


10
আমি দেখতে পাচ্ছি একটি সম্ভাব্য উদ্দেশ্য হ'ল :বিকল্প হিসাবে ব্যবহার করা true। সম্ভবত errexitসেট করা আছে এবং লেখক কিছু কমান্ডের প্রস্থান স্থিতি সম্পর্কে চিন্তা করে না।
jw013


স্ট্যাকওভারফ্লো লিঙ্ক করা পৃষ্ঠাটি আইএমওটি আরও কিছুটা বিস্তৃত (এই পৃষ্ঠাটি এবং লিঙ্কযুক্ত পৃষ্ঠা উভয়ই পড়তে ভাল)।
ট্রেভর বয়ড স্মিথ

উত্তর:


29

:আপনার স্ক্রিপ্টের পরিবর্তে এটি ব্যবহার করা হচ্ছে বলে মনে হচ্ছে true। যদি grepফাইলটিতে কোনও মিল খুঁজে না পাওয়া যায় তবে এটি একটি ননজারো প্রস্থান কোডটি ফেরত দেবে; jw013 যেমন একটি মন্তব্যে উল্লেখ করেছে, যদি errexitসেট করা থাকে তবে সম্ভবত শেবাং -eলাইনের মাধ্যমে, grepএস এর মধ্যে কোনও মিল খুঁজে না পেয়ে স্ক্রিপ্টটি প্রস্থান করবে । স্পষ্টতই, লেখক যা চেয়েছিলেন তা নয়, তাই তিনি ( || :বিশেষত) যৌগিক কমান্ডের প্রস্থান স্থিতিটি আরও সাধারণ (আমার অভিজ্ঞতায়) || true/ এর মতো সর্বদা শূন্য করার জন্য যোগ করেছিলেন || /bin/true


Duh। এটি একটি আরপিএম বিল্ড স্ক্রিপ্টের ধারণায় ছিল এবং আমি স্ক্রিপ্টের অভ্যন্তরে কোনও প্রস্থান কোড চেক করতে দেখি না, আমি বিবেচনা করতে ভুলে গেছি যে পিতামাতার প্রক্রিয়াটি হয়তো দেখছে।
কালেব

8
যদি এটি হয় তবে আমি এটিকে দরিদ্র স্ক্রিপ্টিং অনুশীলন বলব। এটি trueপরিবর্তে ব্যবহারের সমতুল্য , তবে শব্দার্থিক অভিপ্রায়টি আরও পরিষ্কার true:যখন একটি সুস্পষ্ট NOP পছন্দ হয় তখন আরও উপযুক্ত।
jw013

আমার অভিজ্ঞতায়, এটি আরপিএম স্ক্রিপ্টগুলির একটি সাধারণ অভ্যাস। এটি সম্ভবত হওয়া উচিত নয়, তবে আমরা সেখানে আছি।
mattdm

কিছু purists :পরিবর্তে পছন্দ করেন trueকারণ :একটি bashঅন্তর্নির্মিত যেখানে trueসাধারণত বেশি ওভারহেড সহ একটি সংকলিত বাইনারি হয়। trueকোডটি বেশি পঠনযোগ্য বলে সাধারণত আমি ব্যবহার করি (একইভাবে আমি এর sourceপরিবর্তে ব্যবহার করতে পছন্দ করি .)।
ট্রেভর বয়েড স্মিথ

36

:Builtin এছাড়াও ব্যাশ "বরাদ্দ ডিফল্ট মান" শেল সম্প্রসারণ, যেখানে সম্প্রসারণ প্রায়ই পার্শ্ব প্রতিক্রিয়া জন্য একমাত্র ব্যবহার করা হয় এবং প্রসারিত মান দূরে নিক্ষিপ্ত হয় দরকারী হল:

# assign FOO=bar iff FOO is unset
: ${FOO:=bar}

2
এটি অনুসন্ধান করতে এখানে এসেছিল, আমি যখন ডিফল্ট মানগুলি ঘোষণার জন্য কোনও স্ক্রিপ্টে এই প্যাটার্নটি দেখে হতবাক হয়ে যাই।
10.33 এ ffledgling

21

আমি :অতীতে দু'টি স্থান ব্যবহার করেছি ।

while :
do
     shell commands
     some exit condition
done

এটি চিরকালীন লুপ।

function doSomethingStub {
    :
}

নিয়ন্ত্রণের শীর্ষ স্তরের প্রবাহটি সঠিকভাবে পেতে, একটি স্টাব ফাংশন রাখুন।

আমি পুরানো দিনগুলিতে ফিরে দেখেছি একটি ব্যবহার: একটি #!/bin/sh(বা যাই হোক না কেন) লাইন পরিবর্তে , আপনি একটি :লাইন দেখতে চাই । কিছু পুরানো রিয়েল ইউনিক্স কার্নেল বা রিয়েল ইউনিক্স শেল এর অর্থ "আমি একটি শেল স্ক্রিপ্ট," আমাকে চালান "বলে ব্যবহার করবে। যেমন আমি মনে করি এটি ঠিক তখনই ছিল যখন সিএসএস একটি সাধারণ ইন্টারেক্টিভ শেল হিসাবে ইনরোডগুলি তৈরি করে।


@ ব্রুসইডিগার: আপনার কি "শেকলন" লাইনের রেফারেন্স রয়েছে?
l0b0

7
পরিশেষে একটি ": একটি স্ক্রিপ্টের শুরুতে" রেফারেন্স এবং ব্যাখ্যা খুঁজে পেয়েছি: faqs.org/faqs/unix-faq/faq/part3/section-16.html
ব্রুস এডিগার

1
শুরুতে আচরণটি :খুব অদ্ভুত। আমি দেখতে পেয়েছি যে এটি সত্যই স্ক্রিপ্টটি দিয়ে চালিত করে sh। যেখানে আপনি যখন কোনও শেবাং ছাড়াই স্ক্রিপ্টটি শুরু করবেন ... এটি শেলটি যা চলছে তা দিয়ে স্ক্রিপ্টটি চালানোর চেষ্টা করে (সুতরাং আপনি যদি bashএটি চালাচ্ছেন তবে এটি চালানোর চেষ্টা করে যেমন bashআপনার আছে cshতবে এটি এটি চালানোর চেষ্টা করে csh)।
ট্রেভর বয়ড স্মিথ

19

:বিল্ট-ইন ইতিমধ্যে ছিল থম্পসন শেল - এটা হচ্ছে নথিভুক্ত জন্য ইউনিক্স V6 থম্পসন শেলের মধ্যে 1975 সালে, :জন্য একটি লেবেল নির্দেশিত gotoকমান্ড। আপনি যদি কখনই gotoকোনও লাইনে কল করার চেষ্টা না করেন তবে সেই লাইনটি কার্যকরভাবে একটি মন্তব্য ছিল।

বোর্ন শেল , বোর্ন / POSIX শাঁস এর পূর্বপুরুষ হিসাবে আমরা তাদের জানি, কখনো ছিল gotoযে আমি জানি, কিন্তু অপরিবর্তিত রাখা :কোন সমিতি কমান্ড (এটি আগে থেকেই উপস্থিত ছিলেন যেমন ইউনিক্স V7 )।


তথ্যবহুল historicalতিহাসিক পটভূমি জন্য পয়েন্ট।
টনি বারগানস্কি

12

আমি একটি পুরানো রেফারেন্সটি খনন করেছি: "দ্য ইউনিক্স প্রোগ্রামিং এনভায়রনমেন্ট" (সি) 1984 কর্নিগান এবং পাইক দ্বারা।

পৃষ্ঠা 147 (শেল প্রোগ্রামিং) এটি বলে:

":" হ'ল একটি শেল অন্তর্নির্মিত কমান্ড যা এর তর্কগুলি মূল্যায়ন করে "সত্য" প্রত্যাবর্তন ছাড়া কিছুই করে না। পরিবর্তে [একটি স্ক্রিপ্ট উদাহরণ উল্লেখ করে], আমরা সত্য ব্যবহার করতে পারতাম , যা নিছক সত্যিকারের প্রস্থান স্থিতি দেয়। (একটি মিথ্যা কমান্ডও রয়েছে।) তবে ':' সত্যের চেয়ে বেশি কার্যকর কারণ এটি ফাইল সিস্টেম থেকে কোনও আদেশ কার্যকর করে না । [ইতালি / জোর আমার।]


2
অবশ্যই, trueএখন অনেকগুলি সিস্টেমে একটি শেল বিল্টিনও।
ট্রিপলি

8

আমি মনে করি মনে হচ্ছে শেলের প্রারম্ভিক সংস্করণগুলিতে কোনও মন্তব্য সিনট্যাক্স ছিল না। শুরু হওয়া একটি লাইন :(যা সম্ভবত একটি বাস্তব নির্বাহযোগ্য, এর অনুরূপ হতে পারে /bin/true) সেরা বিকল্প হতে পারে been

প্রাচীন থম্পসন শেলটির জন্য একটি ম্যান পেজ এখানে রয়েছে (কোনও সম্পর্ক নেই); কোন মন্তব্য সিনট্যাক্সের উল্লেখ নেই।


4
উৎপত্তি :আসলে জন্য একটি লেবেল সূচকটি ছিল gotoকমান্ড, কিছু প্রাচীন শেল (আমি যা জানি না) এ। : somethingকোনও মিল নেই যদি একটি লেবেল একটি মন্তব্য হিসাবে ব্যবহার করা যেতে পারে goto। অনুশীলন আটকে যাওয়ার পরেও আটকে gotoগেল।
গিলস 'খারাপ হয়ে যাওয়া বন্ধ করুন'

8

":" ডিবাগিংয়ের জন্য কার্যকর।

DEBUGLOG=": debugfunction"

statement
statement
$DEBUGLOG arg1 arg2 ...
statement
statement

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

আর একটি সহজ ব্যবহার হ'ল একটি ব্লক মন্তব্য হিসাবে, যা শেল সিনট্যাক্স থেকে অনুপস্থিত বৈশিষ্ট্য।

: << COMMENT
all --statements --in --here
are now -a here document which are
passed to --the noop
COMMENT
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.