এখানে বাশ কেন একটি স্ট্রিং নতুন লাইনের চর যুক্ত করে?


34

নিম্নলিখিত উদাহরণগুলি দেখায় যে এখানে একটি নতুন পংক্তি যুক্ত করা হয়েছে
কেন এটি করা হয়?

xxd -p <<<'a'  
# output: 610a

xxd -p <<<'a
'
# output: 610a0a

উত্তর:


38

সহজ উত্তর হ'ল কারণ ksh সেইভাবে লেখা (এবং বাশ সামঞ্জস্যপূর্ণ)। তবে সেই নকশা নির্বাচনের জন্য একটি কারণ রয়েছে।

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

tmp=$(foo)
tmp=${tmp//hello/world}
tmp=${tmp#prefix}
bar <<<$tmp

বাশ এবং কেএসএস যাইহোক বাইনারি ডেটা ম্যানিপুলেট করতে পারে না (এটি নাল অক্ষরগুলির সাথে মোকাবেলা করতে পারে না), তাই অবাক হওয়ার মতো বিষয় নয় যে তাদের সুবিধাগুলি টেক্সট ডেটার দিকে এগিয়ে গেছে।

<<<এখানে স্ট্রিং সিনট্যাক্স মত যাহাই হউক না কেন শুধু সুবিধার জন্য বেশিরভাগই হয়, <<এখানে-দস্তাবেজ। আপনার যদি কোনও চূড়ান্ত নিউলাইন যোগ করার প্রয়োজন না হয় তবে echo -n(ব্যাশে) বা printfএকটি পাইপলাইন ব্যবহার করুন।


আমার উত্তর চেয়ে অনেক বেশি পুঙ্খানুপুঙ্খ।
মাইক 0

2
বাশ এখানে ksh93 থেকে স্ট্রিংগুলি ধার করে থাকতে পারে, তবে ksh পরিবর্তে সেগুলি zsh থেকে ধার করেছে, যা সেগুলি প্ল্যান 9 শেল আরসি থেকে পেয়েছে ।
মার্ক রিড

2
<<<দ্বারা বোর্ন বিশ্বের চালু করা হয় zsh, না ksh। এবং এটা ইউনিক্স বন্দর একটি অনুরূপ অপারেটর দ্বারা অনুপ্রাণিত হয় rcযা হয়নি না যে অতিরিক্ত newline অক্ষর যোগ করুন। মজার বিষয় হল, =(<<<text)অপারেটর সেই নতুন লাইনে যুক্ত করে না zsh
স্টাফেন চেজেলাস

আপনি যদি এই উত্তরটির আগ্রহের বিষয়ে অবাক হন তবে এই প্রশ্নটির কারণ এটি ।
ফেডোরকিউ

1
এখানে নতুন স্ট্রিংটি লেখার কোনও উপায় নেই (যেমন কোনও অন্যান্য ইউটিলিটি ব্যবহার না করে printfইত্যাদি) টেলিং নতুন লাইনে এড়ানো bash? @ স্টাফেন চ্যাজেলাস পয়েন্টের মতো এটিই সম্ভব zsh
সিটোদিয়া

3

মোড সক্রিয় readথাকাকালীন কমান্ডটি ব্যবহার করার সময় একটি দৃশ্যে এটি-স্ট্রিংগুলিতে নতুন লাইন যুক্ত হওয়া ব্যবহারিক set -e। স্মরণ করুন যে set -eকোনও স্ক্রিপ্টের অবসান ঘটায় যখন এটি (আরও বা কম) এমন বিবৃতিগুলির মুখোমুখি হয় যা একটি শূন্য নয় এমন স্থিতি কোড উত্পন্ন করে। বিবেচনা করুন যে readযখন নিউলাইন ছাড়াই স্ট্রিংয়ের মুখোমুখি হয় তখন একটি নন-শূন্য স্থিতি কোড উত্পন্ন করে:

#!/bin/bash
set -e

# The following statement succeeds because here-strings append a newline:
IFS='' read -r <<< 'newline appended'
echo 'Made it here'

# The following statement fails because 'read' returns a non-zero status
# code when no newlines are encountered.
printf 'no newline' | IFS='' read -r
echo 'Did not make it here'

-3

আমি মনে করি যে এখানে স্ট্রিংয়ের শেষে একটি নতুন লাইন পাওয়ার একমাত্র উপায়, প্রমাণ:

xxd <<<`echo -ne "a\n"`

এটি প্রদর্শিত হবে যে এখানে স্ট্রিং অপারেটর আপনাকে নতুন জমা দেওয়া সিনট্যাক্সে দেওয়া না হলে নিউলাইনগুলি স্ট্রিপ করে in


4
এটি কমান্ড প্রতিস্থাপন যা চূড়ান্ত নতুন লাইনটি ছড়িয়ে দিচ্ছে। আপনি এটিকে সহজ করতে পারেন xxd <<<$(echo a)
গিলস 'তাই মন্দ হওয়া বন্ধ করুন' :
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.