যদিও @ সাইরাস সঠিক - এটি আসলে পুরো প্রশ্নের উত্তর দেয় না এবং কী ঘটছে তার কোনও ব্যাখ্যা নেই।
সুতরাং এটি মাধ্যমে চলুন যাক।
স্ট্রিংয়ে নিউলাইনস
প্রথমে প্রত্যাশিত বাইট ক্রম নির্ধারণ করুন:
$ { echo a; echo b; } | xxd
0000000: 610a 620a a.b.
এই বাইট ক্রমটি ক্যাপচার করার জন্য এখন, কমান্ড সাবস্টিটিউশন (বিভাগ 3.5.3) ব্যবহার করুন:
$ x=$( echo a; echo b; )
তারপরে, বাইট ক্রমটি যাচাই করতে একটি সাধারণ প্রতিধ্বনি করুন:
$ echo $x | xxd
0000000: 6120 620a a b.
সুতরাং মনে হচ্ছে প্রথম নিউলাইনটি একটি স্থানের সাথে প্রতিস্থাপন করা হয়েছিল এবং দ্বিতীয় নতুন লাইন অক্ষত ছিল। কিন্তু কেন ?
আসুন এখানে কী ঘটছে তা দেখুন:
প্রথমে বাশ শেল প্যারামিটার সম্প্রসারণ করবে (বিভাগ 3.5.3)
'$' অক্ষরটি প্যারামিটার সম্প্রসারণ, কমান্ড প্রতিস্থাপন বা গাণিতিক সম্প্রসারণের পরিচয় দেয়। প্যারামিটারের নাম বা প্রতীকটি প্রসারিত হতে পারে ব্রেসগুলি আবদ্ধ করা যেতে পারে, যা alচ্ছিক তবে ভেরিয়েবলটিকে অক্ষরগুলি থেকে তত্ক্ষণাত্ প্রসারিত করা যায় যা নামের অংশ হিসাবে ব্যাখ্যা করা যায় protect
তারপরে বাশ ওয়ার্ড বিভাজন করবে (বিভাগ 3.5.3)
শেলটি পরামিতি সম্প্রসারণ, কমান্ড প্রতিস্থাপন এবং পাটিগণিতের বিস্তারের ফলাফলগুলি স্ক্যান করে যা শব্দ বিভাজনের জন্য ডাবল উদ্ধৃতিগুলির মধ্যে ঘটে না।
শেলটি $ আইএফএসের প্রতিটি চরিত্রকে একটি সীমানার হিসাবে বিবেচনা করে এবং অন্যান্য বিস্তারের ফলাফলগুলিকে এই অক্ষরগুলির শব্দের মধ্যে বিভক্ত করে। যদি আইএফএসটি সেট না করা থাকে, বা এর মানটি হুবহু ...
এরপরে, বাশ এটিকে সাধারণ কমান্ড হিসাবে বিবেচনা করবে (বিভাগ 3.2.1)
একটি সাধারণ কমান্ড হ'ল ধরণের কমান্ড যা প্রায়শই সম্মুখীন হয়। এটি শব্দের নিয়ন্ত্রণ অপারেটরগুলির একটি দ্বারা সমাপ্ত হয়ে ফাঁকা দ্বারা পৃথক শব্দের একটি ক্রম (সংজ্ঞা দেখুন)। প্রথম শব্দটি সাধারণত একটি কমান্ড নির্বাহ করার জন্য নির্দিষ্ট করে এবং বাকী শব্দগুলি সেই আদেশের যুক্তিযুক্ত থাকে।
ফাঁকা সংজ্ঞা (বিভাগ 2 - সংজ্ঞা)
ফাঁকা একটি স্থান বা ট্যাব অক্ষর।
অবশেষে, বাশ প্রতিধ্বনি (বিভাগ 4.2 - ব্যাশ বিল্টিন কমান্ড) অভ্যন্তরীণ কমান্ডের অনুরোধ জানায়
... ফাঁকা দ্বারা পৃথক করা আরোগুলি আউটপুট করুন, একটি নতুন লাইন দিয়ে সমাপ্ত। ...
সুতরাং সংক্ষেপে বলতে গেলে, নিউলাইনগুলি ওয়ার্ড স্প্লিটিং দ্বারা মুছে ফেলা হয় এবং তারপরে প্রতিধ্বনিগুলি 2 টি আর্গ, "এ" এবং "বি" পায় এবং তারপরে ফাঁকা ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে একটি নিউলাইন দিয়ে শেষ হয়।
@ সাইরাস যা বলেছিল তা করা (এবং -n এর সাথে ইকো থেকে নতুন লাইনটি দমন করা) ফলাফল আরও ভাল:
$ echo -n "$x" | xxd
0000000: 610a 62 a.b
স্ট্রিংয়ের শেষে নিউলাইনগুলি
এটি এখনও নিখুঁত নয়, পেছনের নতুন লাইনটি চলে গেছে। এ পুরো বিষয়টা বিস্তারিত বিবেচনা জন্যে কমান্ড উপকল্পন (অনুচ্ছেদ 3.5.4) :
বাশ কমান্ড কার্যকর করে এবং কমান্ডের বিকল্পের পরিবর্তে কমান্ডের স্ট্যান্ডার্ড আউটপুট সহ কোনও নতুন ট্র্যাকিং নিউলাইন মুছে ফেলা করে।
এখনই এটি স্পষ্ট হয়েছে যে কেন নিউলাইনটি চলে যায়, বাশকে তা বজায় রাখতে বোকা বানানো যায়। এটি করতে, শেষে অতিরিক্ত স্ট্রিং যুক্ত করুন এবং ভেরিয়েবলটি ব্যবহার করার সময় এটি সরিয়ে ফেলুন:
$ x=$( echo a; echo b; echo -n extra )
$ echo -n "${x%extra}" | xxd
0000000: 610a 620a a.b.
টি এল; ডিআর
আউটপুট শেষে অতিরিক্ত অংশ যোগ করুন, এবং উদ্ধৃতি ভেরিয়েবল:
$ cat /no/file/here 2>&1 | xxd
0000000: 6361 743a 202f 6e6f 2f66 696c 652f 6865 cat: /no/file/he
0000010: 7265 3a20 4e6f 2073 7563 6820 6669 6c65 re: No such file
0000020: 206f 7220 6469 7265 6374 6f72 790a or directory.
$ cat /no/file/here 2>&1 | cksum
3561909523 46
$
$ var=$( cat /no/file/here 2>&1; rc=${?}; echo extra; exit ${rc})
$ echo $?
1
$
$ echo -n "${var%extra}" | xxd
0000000: 6361 743a 202f 6e6f 2f66 696c 652f 6865 cat: /no/file/he
0000010: 7265 3a20 4e6f 2073 7563 6820 6669 6c65 re: No such file
0000020: 206f 7220 6469 7265 6374 6f72 790a or directory.
$ echo -n "${var%extra}" | cksum
3561909523 46