আমার কমান্ড প্রতিস্থাপন থেকে পিছনে থাকা নতুন লাইনের চরটি কোথায় গেল?


15

নিম্নলিখিত কোডটি পরিস্থিতিকে সর্বোত্তমভাবে বর্ণনা করে। শেষ লাইনটি কেন পিছনের নিউ লাইনের চরটিকে আউটপুট দিচ্ছে না? প্রতিটি লাইনের আউটপুট মন্তব্যটিতে প্রদর্শিত হবে। আমি জিএনইউ ব্যাশ, সংস্করণ 4.1.5 ব্যবহার করছি

     echo -n $'a\nb\n'                  | xxd -p  # 610a620a  
           x=$'a\nb\n'   ; echo -n "$x" | xxd -p  # 610a620a
     echo -ne "a\nb\n"                  | xxd -p  # 610a620a
x="$(echo -ne "a\nb\n")" ; echo -n "$x" | xxd -p  # 610a62

4
বিরল সময়ে যখন প্রয়োজন হয় তার জন্য কঠোর প্রচেষ্টা:tmp=$(somecommand; echo a); tmp=${tmp%a}
গিলস 'অসম্পূর্ণ হওয়া বন্ধ করুন'


1
@Gilles: আপনার উদাহরণ পুনরায় উপরোক্ত: tmp=$(somecommand; echo a)... এই অবশ্যই বিন্দু বাড়িতে চালিত হয়েছে ... যতক্ষণ না আমি উদাহরণ দেখে আমার tendancy এখনও ব্যবহার হত echo -n a... কিন্তু, অবশ্যই !, এর কোন প্রয়োজন নেই -nকারণ কমান্ড উপকল্পন কোনো ক্ষেত্রে চালু trailing সম্পর্কে newline সরাবে! ... ধন্যবাদ ...
পিটার.ও

উত্তর:


18

কমান্ড সাবস্টিটিউশন ফাংশন $()(এবং এর চাচাত ভাই ব্যাকটিক) বিশেষভাবে অনুসরণকারী নতুনলাইনগুলি সরিয়ে দেয়। এটি নথিভুক্ত আচরণ , এবং নির্মাণ ব্যবহার করার সময় আপনার সর্বদা সচেতন হওয়া উচিত।

প্রতিস্থাপন অপারেটর দ্বারা পাঠ্য সংস্থার অভ্যন্তরে থাকা নিউলাইনগুলি সরানো হয় না, তবে শেলটিতে শব্দ বিভাজন করার সময় সেগুলিও মুছে ফেলা হতে পারে, তবে কীভাবে দেখা যায় যে আপনি কোট ব্যবহার করেছেন কিনা তা নির্ভর করে। এই দুটি ব্যবহারের মধ্যে পার্থক্যটি নোট করুন:

$ echo -n "$(echo -n 'a\nb')"
a
b

$ !! | xxd -p
610a62

$ echo -n  $(echo -n 'a\nb')
a b

$ !! | xxd -p   
612062

দ্বিতীয় উদাহরণে, আউটপুটটি উদ্ধৃত হয়নি এবং নিউলাইনটি শব্দ-বিভাজন হিসাবে ব্যাখ্যা করা হয়েছিল, ফলে আউটপুটে এটি একটি স্থান হিসাবে প্রদর্শিত হবে!


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

6

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

$ echo "$(echo -e '\n')" | wc
 1       0       1

$ echo -e '\n' | wc
2       0       2

এবং আরও ব্যবহারিকভাবে, pwdআপনার ডিরেক্টরি নামের মধ্যে একটি নতুন লাইন থাকলেও এটি কাজ $(pwd)করবে তবে তা করবে না।

সাধারণ কমান্ডটি হ'ল আপনার আদেশের শেষে কিছু যুক্ত করা এবং তারপরে এটি ছড়িয়ে দেওয়া।


1
ধন্যবাদ ফিলোম্যাথ ... যাইহোক, আপনি প্রথম উদাহরণটি সিন্টেক্সিকভাবে ভুল ('ডাব্লুসিপি' একটি স্ট্রিংকে আর্গ হিসাবে গ্রহণ করেন না) .. আপনার উদাহরণগুলির অর্থ বোঝার জন্য, প্রথমটিরটি হতে পারে echo "$(echo -e '\n')" | wc, যা 1   0   1তুলনা করে তুলনা করে,2   0   2
পিটার.ও

@ ফ্রেড: ওফ, মাত্র একটি টাইপ
ফিলোমাথ

1
"স্পেসে রূপান্তরিত" উপযুক্ত ব্যাখ্যা নয়, এখানে কিছু বিভাজন জড়িত রয়েছে। বিশেষত আপনি আইএফএস থেকে স্থান সরাতে পারেন এবং সেগুলি বিভাজক হিসাবে কাজ করবে না। আরও বেশি, আপনার উদাহরণটি একটি বিশেষ কেস বিভাগে আসে এবং কালেবের উত্তর দেখুন $(pwd)এবং এর মধ্যে পার্থক্য রয়েছে "$(pwd)"
স্টাফেন গিমেনেজ

পিএস..আপনার সাধারণ কাজের বিষয়ে আপনার পরামর্শটি কেবল এটিকে পরিষ্কার করার জন্য আমার প্রয়োজন ছিল
পিটার.ও

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