মেটাচার্যাক্টারের আশেপাশে কেন কখনও সাদা স্থান প্রয়োজন হয়?


543

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

bash: syntax error near unexpected token `{:'

গতকাল এটি হয়েছিল যখন আমি এটি বন্ধুর বাশ শেলের মধ্যে চালানোর চেষ্টা করেছি এবং তারপরে আমি শ্বেত স্পেস যুক্ত করেছি এবং এটি হঠাৎ :(){ :|:& };:পরিবর্তে পরিবর্তিত হয়ে কাজ করেছে:(){:|:&};:

হোয়াইটস্পেসের বিষয়টি কী? আমি কি আমার বাহুতে একটি সিনট্যাক্স ত্রুটি আঁকিয়েছি ?!

মনে হয় সবসময় zsh এ কাজ করে তবে বাশে নয়।

সম্পর্কিত প্রশ্নটি সাদা জায়গাগুলি সম্পর্কে কোনও ব্যাখ্যা দেয় না, যা সত্যই আমার প্রশ্ন; বাশকে সঠিকভাবে বিশ্লেষণ করতে সক্ষম হওয়ার জন্য সাদা জায়গার কেন প্রয়োজন?


6
আমি এখানে একই প্রশ্ন পোস্ট করেছি (উলকি অংশটি বাদ দিয়ে)।
বেনোইট

3
এছাড়াও, কোলন (:) কোনও ফাংশন নাম হিসাবে ব্যবহার করা যাবে না (দেখুন: pubs.opengroup.org/onlinepubs/9699919799/utilities/… ) ... ফ্রিবিএসডি এর / বিন / এস এমনকি এতে ত্রুটি দেয় ...
মার্টিন টর্নয়েজ

5
@ কারপেটসমোকার: আমি নিশ্চিত না যে এটি কীভাবে প্রাসঙ্গিক। এই প্রশ্নগুলি বাশ সম্পর্কে।
ডেনিস

উত্তর:


267

অক্ষরগুলির একটি তালিকা রয়েছে যা BASH এ আলাদা টোকেন করে। এই অক্ষরগুলি বলা হয় metacharacters তারা এবং |, &, ;, (, ), <, >, স্থান এবং ট্যাব । অন্যদিকে, কোঁকড়ানো ধনুর্বন্ধনী ( {এবং }) কেবলমাত্র সাধারণ অক্ষর যা শব্দ তৈরি করে।

পূর্বে দ্বিতীয় স্থান ছাড়াই করা }হবে, যেহেতু &একটি মেটাচার্যাক্টর। অতএব, আপনার ট্যাটুতে কমপক্ষে একটি স্থানের অক্ষর থাকা উচিত।

:(){ :|:&};:

35
সহজ সমাধান: টাউয়ের প্রথম অংশটি বাম দিকে নিয়ে যান এবং ত্বকের দুটি অংশের মধ্যে প্রতিস্থাপন করুন।

23
আমি শব্দটি পছন্দ করেছি on the other hand... ;): ডি (দুঃখিত, বিষয় মন্তব্য বন্ধ করার জন্য।)
আনিসনে

4
তবে এই zsh এর জন্য আলাদা? কোন উপায়ে zsh আলাদা?
tfogo

2
গুড ব্যাখ্যা, তা ব্যতীত {এবং }হয় শেল কীওয়ার্ড এই প্রেক্ষাপটে। পার্শ্ববর্তী স্থান / মেটাচার্যাক্টরের অভাবে - যদি এগুলি হিসাবে স্বীকৃত না হয় কেবল তখনই তাদের শব্দের আভিধানিক অঙ্গ হিসাবে বিবেচনা করা হয় যা তারা একটি অংশ হয়ে যায়। (এবং তারপরে বন্ধনী সম্প্রসারণ রয়েছে, যা ভিন্ন প্রেক্ষাপটে ঘটে))
mklement0

2
@ দিমিত্রিচুবরভ বন্ধনীগুলি কমান্ডের নামগুলিতে অনুমোদিত (ফাংশন সহ: {foo} () { echo hello; }"নাম", bash"কেবলমাত্র বর্ণানুক্রমিক অক্ষর এবং আন্ডারস্কোর সমন্বিত একটি শব্দ দ্বারা বর্ণিত এবং বর্ণানুক্রমিক অক্ষর বা আন্ডারস্কোর দিয়ে শুরু করা", কেবল পরিবর্তনশীল নামের ক্ষেত্রে প্রযোজ্য)।
চিপনার

82

শুধু উলকি a

#!/bin/zsh

তার উপরে শেবাং এবং আপনি ভাল থাকবেন।


6
যদি আমরা বাছাই করি তবে শেবাং কিছুতেই কাজ করবে না, যেমন শেল, আশা করি zsh, ইন্টারেক্টিভ মোডে রয়েছে, যেমন প্রম্পটের দ্বারা প্রমাণিত হয়েছে ...
এসজেজি

50

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

(ls)

যা কাজ করে এবং:

{ls}

যা নামের একটি আদেশের সন্ধান করে {ls}। কাজ করার জন্য, এটি হতে হবে:

{ ls; }

সেমিকোলন বন্ধনী বন্ধনীটিকে প্যারামিটার হিসাবে নেওয়া বন্ধ করে দেয় ls

আপনাকে যা করতে হবে তা হ'ল লোকদের বলতে হবে যে আপনি একটি সংকীর্ণ স্থান চরিত্রের সাথে আনুপাতিক-ফন্ট ব্যবহার করছেন।


12
@ দিমিত্রিচুভারভ - ধনুর্বন্ধনীগুলির সম্পূর্ণ ভিন্ন অর্থ ব্যবহার করে এটি একটি অত্যন্ত চতুর কৌশল। এটি কমা-বিচ্ছিন্ন মানগুলির তালিকা প্রসারিত করে, যা এই ক্ষেত্রে কেবলমাত্র ls
পিটার ওয়েস্টলেকে

7
তবে… ছেলে… তুমি সারা জীবন উলকি আঁকতে যাচ্ছ! আপনি নিজেকে সর্বকালের জন্য নির্বোধ হিসাবে চিহ্নিত করেছেন! এবং তারপরে এটি সেলাই করার আগে আপনি এটি সঠিকভাবে পেতে পারেন না? আমার ধারণা অনুমান হওয়ার বাইরে এটি দুটি পদক্ষেপ ;-) কোনও অপরাধ নেই, পাল, আমি কেবল ভাবছি।
আলফ

14
@ এটিকে উল্কি করার আগে আমি এটি চেষ্টা করেছি, তবে আমি আমার জিএসএসে চেষ্টা করেছিলাম, আমি ভেবেছিলাম এটিতে বাশের মতো পার্সিং রয়েছে। আমার বোকা, তবে আমি কেবল লোকদের বলব যে এটি zsh। :)
স্পাইডন

20
@spydon অথবা আপনি তাদের বলুন যে আপনি যদি উদ্দেশ্যমূলকভাবে স্থান বাদ যাতে মানুষ আপনার উলকি থেকে কমান্ড কপি দুর্ঘটনাক্রমে চলবে না এবং তাদের মেশিন বিপর্যস্ত;)
অকর্মা

4
আরে, যদি এটি zsh এ বৈধ হয় তবে কেন এটি ঠিক উপরে (বা এর আগে) #! / Bin / zsh যুক্ত করবেন না? এটি প্রথমে শেলটি নির্দিষ্ট করে দেওয়া ভাল অনুশীলন h
অ্যাডাম মিলার

41

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

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

40

এবং তারপরে আমি হোয়াইটস্পেস যুক্ত করেছিলাম এবং হঠাৎ এটি কাজ করে ...

এটি শেল কীভাবে পার্স হয় তার কারণ এটি। ফাংশন সংজ্ঞা শুরু হওয়ার পরে, অর্থাত্ পরে আপনার একটি স্থান প্রয়োজন {

foo() { echo hey& }
foo() { echo hey&}
foo(){ echo hey&}

বৈধ হয়। অন্য দিকে,

foo() {echo hey&}

নয়।


আপনার আসলে এটির মতো একটি টিটু দরকার:

এখানে চিত্র বর্ণনা লিখুন


উত্স থেকে :

  /* We ignore an open brace surrounded by whitespace, and also
     an open brace followed immediately by a close brace preceded
     by whitespace.  */

{কারণগুলির পরে কোনও স্থান {echoছাড়াই একক টোকেন হিসাবে ব্যাখ্যা করা যায়।


এর সমতুল্য রূপ

:(){ :|:& };:

হবে

:(){
:|:& };:

মনে রাখবেন যে {বিকল্প সংস্করণে এর পরে কোনও স্থান নেই , তবে একটি লাইন-ব্রেকের ফলে শেলটি {একটি টোকেন হিসাবে স্বীকৃতি দেয় ।


"Space এর পরে কোনও স্থান ছাড়ার ফলে প্রতিধ্বনিটি একক টোকেন হিসাবে ব্যাখ্যা করা যায়।" - সুতরাং পার্সার কি বিশ্বাস করে যে এটি {echoএকটি প্রয়োজনীয় খোলার ধনুর্বন্ধনী পৌঁছানোর আগে ডাকা একটি আদেশের মুখোমুখি হয়েছে?
জোনাহ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.