\ আইএফএসে 'FS n' = $ '\ n' একটি পরিবর্তনশীল?


12

আমি লক্ষ্য করেছি যে নিউলাইনটি সেট IFSকরতে একটি f উপসর্গ হিসাবে থাকা উচিত

IFS=$'\n'

কিন্তু যদি কোনও কোলন সেট করা থাকে তবে ঠিক

IFS=:

কি \nএকটি পরিবর্তনশীল হয়?

উত্তর:


21

যে $'...'মধ্যে bashসম্প্রসারণ প্যারামিটার নয়, এটা চালু উদ্ধৃতি একটি বিশেষ ধরনের ksh93সেই বিস্তৃতি \n, \x0a, \12একটি newline অক্ষর কোডগুলি। zshএছাড়াও যুক্ত \u000aksh93এবং bashআছে \cjযখন zshআছে \C-Jksh93এছাড়াও মত বৈচিত্রগুলি সমর্থন করে \x{a}

$এটি কিছু ফর্ম বা সম্প্রসারণ একটি সূত্র। তবে যে কোনও ক্ষেত্রে, এটি অন্যান্য ধরণের বিস্তৃতি থেকে পৃথক হয় যা ব্যবহার করে $(যেমন $((1 + 1)), $paramবা $(cmd)) যে এটি ডাবল কোটস বা এখানে নথিতে ( সমস্ত শেলের echo "$'x'"আউটপুট $'x'যদিও পসিক্সে অনির্ধারিত থাকে) হয় না এবং এর সম্প্রসারণ বিভক্ত হয় না + গ্লোব, এটি অবশ্যই কোনও এক্সটেনশন অপারেটরের চেয়ে কোটিং অপারেটরের কাছাকাছি।

IFS=\nথেকে IFS সেট হবে n( \একটি উদ্ধৃতি অপারেটর হিসাবে গণ্য হবে) এবং IFS="\n"বা IFS='\n'IFS সেট হবে দুই অক্ষর ব্যাকস্ল্যাশ এবং n

আপনি এটি ব্যবহার করতে পারেন:

IFS='
'

অথবা

IFS="
"

অথবা

IFS=$'
'

একটি আক্ষরিক সম্পর্কে newline প্রেরণ করার জন্য, যে যদিও কম সহজপাঠ্য (এবং এক ভালো জিনিস ব্যবহার ছাড়া অন্য দেখতে পারে না set listযে viকিনা $IFSযে কোড অন্যান্য ব্যবধান অক্ষর রয়েছে)।

IFS=:, IFS=':', IFS=":", IFS=$':'করার জন্য সেট IFS :তাই এটা কোন ব্যাপার না, যা আপনি ব্যবহার করেন।

$'...': অন্তত দ্বারা (বৈচিত্র সঙ্গে) সমর্থিত ksh93, zsh, bash, mksh,, busybox sh, ফ্রিবিএসডি shksh93এবং bashআরো একটি আছে $"..."লেখার স্থানীয়করণ জন্য ব্যবহৃত উদ্ধৃতি আকারে যদিও এটা খুব কমই স্থাপন এবং portably এবং নির্ভরযোগ্যভাবে ব্যবহার করার জন্য এটি এর কষ্টকর হিসাবে ব্যবহার করছে।

esএবং fishশাঁস এছাড়াও ব্যবহার করতে পারেন \nকোট বাহিরে সম্পর্কে newline প্রসারিত করতে।

কিছু সরঞ্জামের মতো printf, কিছু বাস্তবায়ন echoবা awkএগুলি \nনিজের দ্বারা প্রসারিত করতে পারে। উদাহরণস্বরূপ, কেউ এটি করতে পারেন:

printf '\n'
awk 'BEGIN{printf "\n"}'
echo
echo '\n\c' # UNIX compliant echos only

নিউলাইন চরিত্রের আউটপুট, কিন্তু নোট করুন:

আইএফএস = $ (প্রিন্টফ '\ n')

কমান্ড প্রতিস্থাপন ( $(...)) সমস্ত নতুন লাইনের অক্ষর অনুসরণ করে work তবে আপনি ব্যবহার করতে পারেন:

eval "$(printf 'IFS="\n"')"

যা কাজ করে কারণ printfএকটি "অক্ষরে শেষ হয় আউটপুট একটি নতুন লাইন নয়।

এখন, সম্পূর্ণতার জন্য, rcশেল এবং ডেরিভেটিভসে (যেমন esবা akanga), $'\n'সত্যই সেই \nপরিবর্তনশীলটির প্রসারণ (একটি পরিবর্তনশীল যার নাম দুটি অক্ষরের ক্রম \এবং n)। ভেরিয়েবলের নামগুলিতে কী অক্ষর থাকতে পারে এবং কেবলমাত্র এক প্রকারের উদ্ধৃতি থাকতে পারে - এই শেলগুলির কোনও সীমাবদ্ধতা নেই '...'

$ rc
; '\n' = (foo bar)
; echo $'\n'
foo bar
; echo $'\n'(1)
foo

rcভেরিয়েবলগুলি সমস্ত পরিবেশেও রফতানি করা হয় তবে কমপক্ষে ইউনিক্স ভেরিয়েন্টে rcযেমন চলক নামগুলির জন্য \n, পরিবেশের ভেরিয়েবল সংস্করণটি এক প্রকারের এনকোডিংয়ের মধ্য দিয়ে যায়:

; env | grep foo | sed -n l
__5cn=foo\001bar$

( 0x5cASCII এর বাইট মান হিসাবে \; কীভাবে অ্যারে ভেরিয়েবলটি বিভাজক হিসাবে 0x1 বাইট দিয়ে এনকোড করা হয়েছিল তাও দেখুন)।


1
+1জ্ঞানের সাধারণ অমানবিক স্তরের জন্য
স্টিভেন পেনি

10

এটি এএনএসআই-সি উদ্ধৃতি :

ফর্মের শব্দগুলি $'string'বিশেষভাবে চিকিত্সা করা হয়। শব্দটি প্রসারিত হয় string, এএনএসআই সি স্ট্যান্ডার্ড অনুসারে ব্যাকস্ল্যাশ-পলায়নযুক্ত অক্ষর প্রতিস্থাপন করা হয়েছিল।

সুতরাং $'\n'একটি নতুন লাইন দ্বারা প্রতিস্থাপিত হয়।

এটি শেল প্যারামিটার সম্প্রসারণের সাথে সম্পর্কিত নয় , ব্যবহার সত্ত্বেও $


6

এর মতো স্ট্রিংগুলি $'\n'চালু করা হয়েছিল ksh93এবং বর্তমানে পসিক্স স্ট্যান্ডার্ডের অংশ নয়।

তারা বেশিরভাগ সি ব্যবহার করে একইভাবে পালাতে পারে, উদাহরণস্বরূপ $'\u2345'এবং সেগুলি দ্বারা সমর্থিত পালকগুলি echo

মনে রাখবেন যে যদি আপনি (ksh93 বা ব্যাশের ক্ষেত্রে) এই পালানোর পদ্ধতিটি ব্যবহার করতে না চান তবে আপনি এখনও ব্যবহার করতে পারেন:

IFS='
'

যা সমান তবে পড়া শক্ত।

বিটিডাব্লু: এই এক্সটেনশানটি ইতিমধ্যে পসিক্স স্ট্যান্ডার্ড কমিটিকে পাস করেছে, তবে এটি এসইএসভি 8 এর জন্য নির্ধারিত হয়েছে যা ২০২০ সালের আগে উপস্থিত হবে না বলে আশা করা হচ্ছে কারণ আমাদের বাগের বর্তমান তালিকার পিছনে প্রথমে আমাদের পিছনে কাজ করা দরকার।


$'...'প্রসারণও চেয়ে আলাদা echo। বিন্যাসের যুক্তির জন্য এগুলি আরও পছন্দ করে printf। জন্য echo, একটি 0 প্রয়োজন বোধ করা হয় \0123কিছুদিনের জন্য $'...'এবং printfফরম্যাট, \0123হবে \012একটি newline একটি litteral 3. দ্বারা অনুসরণ
Stéphane Chazelas

1
নোট করুন যে $'...'স্পেসিফিকেশনটি এখনও আলোচনা করা হচ্ছে। বর্তমানে প্রস্তাবিত শব্দের সাথে এখনও বেশ কয়েকটি সমস্যা সমাধান হতে পারে।
স্টাফেন চেজেলাস

আইআইআরসি, এটি বন্ধ ছিল কিন্তু আবার খোলা হয়েছে। এটি কার্যকর হওয়ার আগে এখনও প্রচুর সময় আছে এই কারণে, আমি এটির সাথে আসল সমস্যাটি দেখছি না।
ছদ্মবেশে

1
এটি বন্ধ ছিল, আমি বেশ কয়েকটি আপত্তি উত্থাপন করেছি, এটি পুনরায় খোলা হয়েছিল, এটি আবার সংশোধন করা হয়েছিল, এখনও বেশ কয়েকটি সমস্যা রয়েছে (তাদের বেশিরভাগ \uxxxxসম্প্রসারণ সম্পর্কে ), এবং বিদ্যমান বাস্তবায়নকে সামঞ্জস্য করতে পারে এমন দৃষ্টিতে কোনও রেজোলিউশন নেই। সুতরাং এটি এটি পরবর্তী পসিক্স সংস্করণে পরিণত না করে। হতে পারে তারা \uxxxxইস্যু 8 এর জন্য এই প্রসারণটি ছেড়ে দিতে পারে , তাই আমাদের এখনও কমপক্ষে থাকতে পারে $'\n'
স্টাফেন চেজেলাস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.