আমি কীভাবে ব্যাশ ব্যাকটিক অপারেটরটিকে আউটপুটগুলিতে নতুন লাইনে রাখতে পারি?


36

ব্যাক ব্যাকটিক সাবস্টিটিউশনে নিউলাইন না খাওয়ার উপায়ে কি উপায় আছে?

উদাহরণ স্বরূপ:

var=`echo line one && echo line two`
echo $var

line one line two

আমি যা চাই তা হ'ল

var=`echo line one && echo line two` # plus some magic
echo $var

line one
line two

উত্তর:


54

এটি ব্যাকটিক্স বিকল্পের সাথে সমস্যা নয়, তবে এটির সাথে echo; কন্ট্রোল ক্যারেক্টারগুলি কাজ করতে আপনাকে ভেরিয়েবলটি উদ্ধৃত করতে হবে:

$ var=`echo line one && echo line two`
$ echo "$var"
line one
line two

সুতরাং, কমান্ড-লিয়েনের একটি ভেরিয়েবল প্রসারিত করার সময় বাশ নিউলাইনগুলি সরিয়ে দেয়? এবং সেই আচরণটি ভেরিয়েবলের উদ্ধৃতি দিয়ে অক্ষম করা যায়?
ধীরে ধীরে po

7
bashকমান্ড নির্বাহ উদ্ধৃত সামনে সঞ্চালিত পরামিতি সম্প্রসারণ অবহিত করা প্রয়োজন bashযে আপনি একটি একক পংক্তি এবং 4 শব্দ মুদ্রণ করতে চান ( line, one, lineএবং two)। চেষ্টা করুন: echo a <many spaces> bএবং echo "a <many spaces> b"এই উত্তরটিও একবার দেখুন ।
সিউরাস

5

যদিও @ সাইরাস সঠিক - এটি আসলে পুরো প্রশ্নের উত্তর দেয় না এবং কী ঘটছে তার কোনও ব্যাখ্যা নেই।

সুতরাং এটি মাধ্যমে চলুন যাক।

স্ট্রিংয়ে নিউলাইনস

প্রথমে প্রত্যাশিত বাইট ক্রম নির্ধারণ করুন:

$ { 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

0

আমি সাইরাস এর উত্তরের বিষয়ে একটি মন্তব্যে আমার ছোট সংযোজনটি রেখে দিতাম, তবে আমার মনে হয় এমন উত্তরগুলিতে আমি এখনও মন্তব্য করতে পারি না। সুতরাং আমি সম্পূর্ণরূপে তার উত্তর সিয়ারসের একটি অংশ নকল করব।

আপনার কোডের প্রথম লাইনে যা ঘটেছিল তা হ'ল ব্যাকটিক্স প্রতিস্থাপনটি দলিল হিসাবে, প্রতিস্থাপন কমান্ডের আউটপুটটির পেছনের নতুন লাইনগুলি খায় । তবে এটি আপনার দুটি লাইনের মধ্যে নতুন লাইন খায় না।

কোডের দ্বিতীয় লাইনে যা ঘটে তা হ'ল প্রতিধ্বনিটি প্রথম এবং দ্বিতীয় লাইনের দুটি আর্গুমেন্টের সাথে কার্যকর হয়। প্রসারিত ভেরিয়েবলের উদ্ধৃতি তা ঠিক করবে: echo "$var"এটি আপনার লাইন এক এবং লাইন দুইয়ের মধ্যে নতুন লাইন সংরক্ষণ করবে। এবং echoডিফল্টরূপে একটি অনুসরণযোগ্য নিউলাইন যুক্ত করবে যাতে সবকিছু ঠিক থাকে।

এখন আপনি যদি কিছু কমান্ড প্রতিস্থাপনের আউটপুটে সমস্ত ট্রিলিং নিউলাইন সংরক্ষণ করতে চান, তবে একটি কমান্ড হ'ল আউটপুটটিকে অন্য একটি লাইন যুক্ত করতে হবে, যা আপনি কমান্ড প্রতিস্থাপনের পরে অপসারণ করতে পারেন, এখানে দেখুন

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