মাল্টলাইন শেল স্ক্রিপ্ট মন্তব্য - এটি কীভাবে কাজ করে?


92

সাম্প্রতিককালে, আমি এর আগে কখনও কখনও দেখেনি এমন একাধিক মন্তব্যের প্রকারে আমি হোঁচট খেয়েছি - এখানে একটি স্ক্রিপ্ট উদাহরণ রয়েছে:

echo a
#
: aaa 
: ddd 
#
echo b

এটি কাজ করে বলে মনে হচ্ছে, এমনকি এটি vimসিনট্যাক্স-হাইলাইট করে। মন্তব্য করার এই স্টাইলটি কী এবং কীভাবে আমি এটি সম্পর্কে আরও তথ্য সন্ধান করব?


1
আপনি যদি এর পরিবর্তে আপনার কোডটিকে মন্তব্য করার জন্য ফাংশনে মুড়িয়ে রাখেন তবে কী হবে? CommentedOutBlock() { echo "test"; }
বুক্সি

উত্তর:


135

এটি কোনও বহু-লাইনের মন্তব্য নয়। #একটি একক লাইন মন্তব্য। :(কোলন) মোটেই কোনও মন্তব্য নয়, বরং শেল বিল্ট-ইন কমান্ড যা মূলত একটি এনওপি , একটি নাল অপারেশন যা সত্য প্রত্যাবর্তন ছাড়া কিছুই করে না true( $?যেমন পার্শ্ব প্রতিক্রিয়া হিসাবে 0 তে সেট করে)। তবে এটি যেহেতু একটি আদেশ, তাই এটি আর্গুমেন্টগুলি গ্রহণ করতে পারে এবং যেহেতু এটি তার যুক্তিগুলিকে উপেক্ষা করে, বেশিরভাগ ক্ষেত্রে এটি অতিমাত্রায় মন্তব্যের মতো কাজ করে। এই ক্লেজটি নিয়ে মূল সমস্যাটি হ'ল যুক্তিগুলি এখনও প্রসারিত হয়, যার ফলে অনেকগুলি অনিচ্ছাকৃত পরিণতি হয়। যুক্তিগুলি সিনট্যাক্স ত্রুটিগুলি দ্বারা এখনও প্রভাবিত হয়, পুনর্নির্দেশগুলি এখনও সম্পাদন করা হয় তাই : > fileকেটে যাবে fileএবং : $(dangerous command)বিকল্পগুলি এখনও চলবে।

শেল স্ক্রিপ্টগুলিতে মন্তব্যগুলি সন্নিবেশ করানোর সর্বনিম্ন আশ্চর্যজনক সম্পূর্ণ নিরাপদ উপায়টি রয়েছে #। এমনকি বহু-লাইনের মন্তব্যের জন্য এটি আটকে দিন। মন্তব্যের জন্য কখনও (আব) ব্যবহার করার চেষ্টা করবেন না :। শেলটিতে কোনও উত্সর্গীকৃত মাল্টি-লাইন মন্তব্য প্রক্রিয়া নেই যা স্ল্যাশ-তারা /* */ফর্মের সাথে Cঅনুরূপ ভাষাগুলির সাথে সাদৃশ্যপূর্ণ ।


সম্পূর্ণতার স্বার্থে, তবে এটি অনুশীলনের সুপারিশ করার কারণে নয়, আমি উল্লেখ করব যে মাল্টি-লাইন "মন্তব্যগুলি" করতে এখানে-নথিগুলি ব্যবহার করা সম্ভব :

: <<'end_long_comment'
This is an abuse of the null command ':' and the here-document syntax
to achieve a "multi-line comment".  According to the POSIX spec linked 
above, if any character in the delimiter word ("end_long_comment" in 
this case) above is quoted, the here-document will not be expanded in 
any way.  This is **critical**, as failing to quote the "end_long_comment" 
will result in the problems with unintended expansions described above. 
All of this text in this here-doc goes to the standard input of :, which 
does nothing with it, hence the effect is like a comment.  There is very 
little point to doing this besides throwing people off.  Just use '#'.
end_long_comment

29
একক উদ্ধৃতিগুলি <<লাইনে রাখার জন্য +1 খুব গুরুত্বপূর্ণ - এটি প্রতিস্থাপন এবং প্রসারণ বন্ধ করে দেয়।
গ্লেন জ্যাকম্যান

4
এবং একটি অতিরিক্ত নোট হিসাবে, :মন্তব্যগুলি হওয়া উচিত এমন জিনিসগুলির সাথে শেল স্ক্রিপ্টগুলি পূরণ করা অতিরিক্ত র‍্যাম / সিপিইউ খরচ করবে। এটি আপনার ডেস্কটপে সাধারণ জিনিসগুলির জন্য কোনও পদক্ষেপ নেবে না, তবে এটি যদি কয়েকশ 'বা কয়েক হাজারবার সেকেন্ডে কার্যকর করা হয় তবে আপনি খুব শক্তিশালী হয়ে যাবেন না
বাহামা

3
@ বাহাহাত: আপনি যদি কয়েক সেকেন্ড বা কয়েক হাজার বার সেকেন্ডে এক্সিকিউট করেন তবে আমি আশা করি আপনি এটি শেলটিতে লিখবেন না ... = /
7heo.tk

1
কখনও কখনও, পাঠ্যের একাধিক লাইনের নাল ইউটিলিটি ব্যবহার করা কার্যকর হতে পারে। মন্তব্যটি শুরু করে শেল স্ক্রিপ্টগুলিতে পিওডি লেখা: <<=cut সম্ভব করে তোলে, বিশদর জন্য এই উদাহরণটি দেখুন । এটি ব্যবহার করা সম্ভব করে তোলে perldoc script.sh। তবে, এই উত্তরে দেখানো মাল্টি-লাইন মন্তব্য এমন কিছু যা অবশ্যই একটি মন্তব্য ব্লক হওয়া উচিত (প্রতিটি লাইন দিয়ে শুরু হওয়া # )।
বেসিক 6

মন্তব্য এবং অন্যান্য আকর্ষণীয় ব্যবহারের ক্ষেত্রে (এমনকি ডায়েনাইক স্ক্রিপ্ট জেনারেশন সহ) উভয়ের জন্য ব্যবহৃত হেরডোকগুলি নিয়ে এখানে একটি চমৎকার আলোচনা রয়েছে: tldp.org/LDP/abs/html/here-docs.html#EX71C
বুগুইজ

28

এটি মন্তব্য করার কোনও স্টাইল নয়। :বিল্ট-ইন কমান্ড একেবারে কিছুই আছে; এখানে মন্তব্য করার জন্য এটি অপব্যবহার করা হচ্ছে।

$ help :
:: :
    Null command.

    No effect; the command does nothing.

    Exit Status:
    Always succeeds.

25

প্রাথমিক শেলগুলিতে, মন্তব্য তৈরি করার একমাত্র উপায় ছিল কোলন।

তবে এটি সত্যিকারের মন্তব্য নয়, কারণ লাইনটি ঠিক একইভাবে পার্স করা হয়েছে অন্য কোনও কমান্ডকে বিশ্লেষণ করার মতো, এবং এর পার্শ্ব প্রতিক্রিয়াও থাকতে পারে। উদাহরণ স্বরূপ:

: ${a:=x} # assigns the value 'x' to the variable, 'a'

: $(command) # executes 'command'

(কখনও কখনও কোলন কেবলমাত্র সেই পার্শ্ব প্রতিক্রিয়াগুলি শুরু করার উদ্দেশ্যে ব্যবহার করা হয়, তবে তারপরে এটি কোনও মন্তব্য হিসাবে ব্যবহৃত হচ্ছে না))

কখনও কখনও কোনও স্ক্রিপ্টের কোনও অংশ মন্তব্য করার জন্য কোলন ব্যবহার করা সুবিধাজনক:

: '
while [ "$n" -ne "$x" ]
do
  : whatever
done
'

এটি প্রতিটি লাইনকে পূর্ববর্তী করার আগে একটি দুর্দান্ত টাইমসভার #, বিশেষত যদি মন্তব্য করা কেবলমাত্র অস্থায়ী হয়।


2
এই একক-উদ্ধৃতি মন্তব্য পদ্ধতি স্ক্রিপ্টের কোনও বিভাগে কাজ করে না যা নিজেই একক-উদ্ধৃতি ব্যবহার করে। এবং আপনি যদি আপনার যতটুকু কাছাকাছি কোথাও কোট ব্যবহার করছেন, তার অর্থ আপনার কাছে স্ক্রিপ্ট জুড়ে সমস্ত বৈধ একক উদ্ধৃতি ছিটানো হবে। কোনও শালীন সম্পাদক ব্যবহার করা এত সহজ যে আপনাকে লাইনওয়ালা মন্তব্যগুলি ব্লক করতে দেয়।
jw013

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

একক উদ্ধৃতি বা ডাবল উদ্ধৃতিটির পছন্দটিকে তুচ্ছ এবং অপ্রাসঙ্গিক উদ্বেগ হিসাবে খুব বেশি প্রভাবিত করা উচিত কারণ আপনার স্ক্রিপ্টের পাঠ্যটি নিজেই একটি বৈধ একক-উদ্ধৃত স্ট্রিং কিনা। একক উদ্ধৃতি প্রসার রোধ করতে ব্যবহৃত হয়, অন্যদিকে ডাবল উদ্ধৃতি নির্দিষ্ট বিস্তারের অনুমতি দেয় এবং অতিরিক্ত পার্সিং প্রয়োজন। কোনটি ব্যবহার করবেন তা নির্ধারণের জন্য এটিই আসল মানদণ্ড।
jw013

এটি এখন পর্যন্ত এটি করার সবচেয়ে চতুর উপায়। ডকুমেন্টেশনের সামান্য ব্লকের জন্য দুর্দান্ত। আমি এটির চেয়ে ভাল /* */এবং উগ, আমাকে আরম্ভ করবেন না <!-- -->!
অ্যালেক্স ধূসর

1

আপনার মন্তব্যটি যদি স্ক্রিপ্টের শেষে হয়, আপনি এটি এটি করতে পারেন:

#!/bin/sh
echo 'hello world'
exec true
we can put whatever we want here
\'\"\$\`!#%&()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_
abcdefghijklmnopqrstuvwxyz{|}~
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.