শেল: কমান্ড প্রতিস্থাপনে নতুন লাইনের ('\ n') টিপুন


14

আমি অনুমানযোগ্য নতুন লাইন অক্ষর সহ কমান্ড প্রতিস্থাপনের সঠিক আউটপুট ক্যাপচার করতে সক্ষম হতে চাই ।

আমি বুঝতে পারি যে সেগুলি ডিফল্টরূপে ছিনিয়ে নেওয়া হয়েছে, তাই এগুলি রাখার জন্য কিছু হেরফেরের প্রয়োজন হতে পারে এবং আমি আসল প্রস্থান কোডটি রাখতে চাই

উদাহরণস্বরূপ, চলমান নিউলাইনস এবং প্রস্থান কোডের একটি চলক সংখ্যার সাথে একটি কমান্ড দেওয়া হয়েছে:

f(){ for i in $(seq "$((RANDOM % 3))"); do echo; done; return $((RANDOM % 256));}
export -f f

আমি এরকম কিছু চালাতে চাই:

exact_output f

এবং আউটপুটটি হ'ল:

Output: $'\n\n'
Exit: 5

আমি bashএবং পসিএক্স উভয়ের মধ্যেই আগ্রহী sh


1
নিউলাইন অংশ $IFS, তাই এটি যুক্তি হিসাবে ধরা হবে না।
ডেথগ্রিপ

4
@ ডেথগ্রিপ এর সাথে কিছু করার নেই IFS(চেষ্টা করুন ( IFS=:; subst=$(printf 'x\n\n\n'); printf '%s' "$subst" )Only শুধুমাত্র \tIFS
নতুনলাইনগুলি কেড়ে ফেলা



উত্তর:


17

পসিক্স শেল

কমান্ডের সম্পূর্ণ স্টাডআউট পাওয়ার জন্য স্বাভাবিক ( 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ) কৌশলটি হ'ল:

output=$(cmd; ret=$?; echo .; exit "$ret")
ret=$?
output=${output%.}

ধারণাটি যুক্ত করা এবং অতিরিক্ত করা .\n। কমান্ড প্রতিস্থাপন কেবল এটি ছাঁটাই করবে \n । এবং আপনি .সঙ্গে ফালা ${output%.}

মনে রাখবেন যে শেলগুলিতে ব্যতীত অন্য শেলগুলিতে zshআউটপুটটিতে NUL বাইট থাকলে তা এখনও কাজ করবে না। সহ yash, আউটপুট পাঠ্য না হলে এটি কাজ করবে না।

এছাড়াও মনে রাখবেন যে কয়েকটি স্থানীয় অবস্থানগুলিতে, আপনি শেষে কী কী অক্ষরটি সন্নিবেশ করানোর জন্য তা গুরুত্বপূর্ণ। .সাধারণত ভাল থাকতে হবে, তবে অন্য কিছু নাও পারে। উদাহরণস্বরূপ x(অন্য কয়েকটি @উত্তরে ব্যবহৃত হিসাবে) বা বিআইজি 5, জিবি 18030 বা বিআইজি 5 এইচকেএসসিএস অক্ষরগুলি ব্যবহার করে কোনও লোকালয়ে কাজ করবে না। এই অক্ষরগুলিতে, বেশ কয়েকটি অক্ষরের এনকোডিং বা (0x78, 0x40) এর এনকোডিংয়ের সমান বাইটে শেষ হয়x@

উদাহরণস্বরূপ, ūবিআইজি 5 এইচকেএসসিএসে 0x88 0x78 হয় (এবং xএটি ASCII এর মতো 0x78 হয়, একটি সিস্টেমের সমস্ত অক্ষরগুলিতে পোর্টেবল অক্ষর সেটের সমস্ত অক্ষরের জন্য একই অক্ষর থাকতে হবে যার মধ্যে ইংরেজী অক্ষর রয়েছে ) @এবং .) তাই আপনি যদি cmdছিল printf '\x88'এবং আমরা সন্নিবেশিত xপরে, ${output%x}স্ট্রিপ যে ব্যর্থ হবে xযেমন $outputআসলে ধারণ করবে ū

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

@ অ্যারো দ্বারা আলোচিত আরও সঠিক পদ্ধতিটি হ'ল কেবলমাত্র শেষ অক্ষরটি ছড়িয়ে দেওয়ার জন্য লোকেলকে সি তে পরিবর্তন করা ( ${output%.}) যা নিশ্চিত করে যে কেবল একটি বাইট ছিটিয়ে আছে, তবে এটি কোডটিকে উল্লেখযোগ্যভাবে জটিল করে তুলবে এবং সম্ভাব্যতার সাথে সামঞ্জস্যের সমস্যাগুলি প্রবর্তন করবে নিজস্ব.

বাশ / zsh বিকল্প

সহ bashএবং zsh, ধরে নিই যে আউটপুটটির কোনও NUL নেই, আপনি এটিও করতে পারেন:

IFS= read -rd '' output < <(cmd)

প্রদর্শন করে প্রস্থান স্টেটাস পেতে cmd, আপনি কি করতে পারেন wait "$!"; ret=$?মধ্যে bashকিন্তু না zsh

RC / স্প্যানিশ ভাষায় / akanaga

সম্পূর্ণতার জন্য, নোট করুন rc/ es/ akangaতার জন্য অপারেটর রয়েছে। তাদের মধ্যে, `cmd(বা `{cmd}আরও জটিল কমান্ডের হিসাবে প্রকাশিত) কমান্ড প্রতিস্থাপন একটি তালিকা ফেরত দেয় ( $ifsডিফল্টরূপে স্পেস-ট্যাব-নিউলাইনটিতে বিভক্ত হয়ে )। এই শেলগুলিতে (বোর্নের মতো শেলগুলির বিপরীতে), নিউলাইন সরানো কেবল সেই $ifsবিভাজনের অংশ হিসাবে করা হয় । সুতরাং আপনি হয় ফাঁকা $ifsবা ``(seps){cmd}ফর্মটি ব্যবহার করতে পারেন যেখানে আপনি বিভাজকগুলি নির্দিষ্ট করেছেন:

ifs = ''; output = `cmd

বা:

output = ``()cmd

যে কোনও ক্ষেত্রে, কমান্ডের প্রস্থান স্থিতি নষ্ট হয়। আপনার এটিকে আউটপুট এম্বেড করতে হবে এবং এটির পরে বের করতে হবে যা কুশ্রী হয়ে উঠবে।

মাছ

মাছের মধ্যে, কমান্ড প্রতিস্থাপনের সাথে থাকে (cmd)এবং একটি সাব-শেল জড়িত না।

set var (cmd)

একটি তৈরি করে $varআউটপুট সমস্ত লাইনের অ্যারে cmdযদি $IFSখালি নয় এমন হয়, অথবা আউটপুট সঙ্গে cmdআপ ছিনতাই এক (যেমন বিরোধিতা সব অন্যান্য অধিকাংশ শাঁস মধ্যে) newline অক্ষর যদি $IFSখালি।

সুতরাং যে এখনও একটি সমস্যা আছে (printf 'a\nb')এবং (printf 'a\nb\n')একই জিনিস এমনকি একটি খালি সঙ্গে প্রসারিত $IFS

এদিকে কাজ করার জন্য, আমি যে সেরাটি সামনে আসতে পেরেছি তা হ'ল:

function exact_output
  set -l IFS . # non-empty IFS
  set -l ret
  set -l lines (
    cmd
    set ret $status
    echo
  )
  set -g output ''
  set -l line
  test (count $lines) -le 1; or for line in $lines[1..-2]
    set output $output$line\n
  end
  set output $output$lines[-1]
  return $ret
end

একটি বিকল্পটি হ'ল:

read -z output < (begin; cmd; set ret $status; end | psub)

বোর্ন শেল

বোর্ন শেল $(...)ফর্মটি সমর্থন করে না ${var%pattern}অপারেটরকে, তাই এটি অর্জন করা বেশ কঠিন হতে পারে। একটি পদ্ধতির মধ্যে eval এবং উদ্ধৃতি ব্যবহার করা হয়:

eval "
  output='`
    exec 4>&1
    ret=\`
      exec 3>&1 >&4 4>&-
      (cmd 3>&-; echo \"\$?\" >&3; printf \"'\") |
        awk 3>&- -v RS=\\\\' -v ORS= -v b='\\\\\\\\' '
          NR > 1 {print RS b RS RS}; {print}; END {print RS}'
    \`
    echo \";ret=\$ret\"
  `"

এখানে, আমরা একটি উত্পাদন করছি

output='output of cmd
with the single quotes escaped as '\''
';ret=X

যাও পাস করা eval। পসিক্স পদ্ধতির ক্ষেত্রে, যদি 'সেই অক্ষরগুলির মধ্যে একটি যদি অন্য অক্ষরের শেষে এনকোডিং পাওয়া যায় তবে আমাদের একটি সমস্যা (এটি একটি কমান্ড ইঞ্জেকশন দুর্বলতায় পরিণত হওয়ার চেয়ে খারাপতর) হতে পারে তবে ধন্যবাদ, যেমন ., এটি এর মধ্যে একটি নয়, এবং উদ্ধৃতি কৌশলটি সাধারণত শেল কোডের উদ্ধৃতি দিয়ে এমন কিছু ব্যবহার করে যা ব্যবহার করে (লক্ষ্য করুন যে \এতে সমস্যা রয়েছে, তাই ব্যবহার করা উচিত নয় (এছাড়াও "..."কিছু অক্ষরের জন্য আপনাকে ব্যাকস্ল্যাশ ব্যবহার করতে হবে এমন ভিতরেও বাদে )) এখানে, আমরা কেবল এটি 'ঠিক আছে এর পরে ব্যবহার করছি )।

tcsh শেল

Tcsh কমান্ড প্রতিস্থাপনে নতুন লাইন সংরক্ষণ করুন See ... `দেখুন`

(প্রস্থান স্থিতির যত্ন নিচ্ছেন না, যা আপনি এটি অস্থায়ী ফাইলে সংরক্ষণ করে সম্বোধন করতে পারেন ( echo $status > $tempfile:qকমান্ডের পরে))


ধন্যবাদ - এবং বিশেষত বিভিন্ন চরসেটের ক্লুটির জন্য। যদি কোনও ভেরিয়েবলে zshসঞ্চয় করতে পারেন তবে NULকেন IFS= read -rd '' output < <(cmd)কাজ করবেন না ? স্ট্রিংয়ের দৈর্ঘ্য সংরক্ষণ করতে সক্ষম হওয়া দরকার ... এটি 0-বাইট স্ট্রিংয়ের পরিবর্তে ''1 বাইট স্ট্রিং হিসাবে এনকোড করে না \0?
টম হেল

1
@ টমহেল, হ্যাঁ, read -d ''হিসাবে ধরা হয় read -d $'\0'( bashপাশাপাশি সর্বত্র $'\0'যেমন রয়েছে তেমন '')।
স্টাফেন চেজেলাস

আপনি অক্ষর এবং বাইটগুলি বিস্মৃত করছেন। দয়া করে বুঝতে পারেন যে আমরা যদি যা যুক্ত করা হয়েছিল ঠিক তা সরিয়ে দিই, আসল সত্তা অবশ্যই পরিবর্তন করা উচিত না। এটি যুক্ত করা হয় যদি বলা হয় একটি বাইট বলা মুছে ফেলা খুব আলাদা নয় x। আমার সম্পাদিত উত্তর একবার দেখুন।
ইসহাক 14 ই

@ অ্যারো, হ্যাঁ var=value command evalকৌশলটি এখানে ( এছাড়াও ) এবং অস্টিন -গ্রুপ মেলিং তালিকায় আগে আলোচনা করা হয়েছিল। আপনি এটি পোর্টেবল হিসাবে দেখতে পাবেন না (এবং আপনি যখন এর মতো a=1 command eval 'unset a; a=2'বা আরও খারাপ কিছু চেষ্টা করে দেখেন যে এটি এমন ব্যবহারের উদ্দেশ্যে নয়)) প্রথমদিকে আনসেট করার savedVAR=$VAR;...;VAR=$savedVARসময় $VARএটি যা চান তা করেন না for যদি এটি কেবলমাত্র তাত্ত্বিক সমস্যা (একটি বাগ যা বাস্তবে আঘাত করা যায় না), কাজ করে তবে এটি বিরক্ত করার মতো নয়। তবুও, চেষ্টা করার জন্য আমি আপনাকে সমর্থন করব।
স্টাফেন চেজেলাস

আপনি যেখানে LANG=Cস্ট্রিং থেকে বাইট অপসারণ করার জন্য ব্যবহারটি বিযুক্ত করে এবং অবশেষে বাতিল করেছেন তার কোনও লিঙ্ক আছে ? আপনি বাস্তব বিষয়টিকে ঘিরে উদ্বেগ উত্থাপন করছেন, সবগুলি সমাধান করা সহজ। (1) কোনও আনসেট ব্যবহার করা হয়নি (2) ভেরিয়েবল পরিবর্তন করার আগে এটি পরীক্ষা করুন। @ স্টাফেনচাজেলাস
আইজাক

3

নতুন প্রশ্নের জন্য, এই স্ক্রিপ্টটি কাজ করে:

#!/bin/bash

f()           { for i in $(seq "$((RANDOM % 3 ))"); do
                    echo;
                done; return $((RANDOM % 256));
              }

exact_output(){ out=$( $1; ret=$?; echo x; exit "$ret" );
                unset OldLC_ALL ; [ "${LC_ALL+set}" ] && OldLC_ALL=$LC_ALL
                LC_ALL=C ; out=${out%x};
                unset LC_ALL ; [ "${OldLC_ALL+set}" ] && LC_ALL=$OldLC_ALL
                 printf 'Output:%10q\nExit :%2s\n' "${out}" "$?"
               }

exact_output f
echo Done

ফাঁসি কার্যকর:

Output:$'\n\n\n'
Exit :25
Done

দীর্ঘ বিবরণ

পসিক্স শেলগুলি অপসারণের সাথে মোকাবেলা করার জন্য সাধারণ জ্ঞান \nহ'ল:

একটি যোগ করুন x

s=$(printf "%s" "${1}x"); s=${s%?}

এটি আবশ্যক কারণ সর্বশেষ নতুন লাইন ( গুলি ) প্রতি পসিক্স স্পেসিফিকেশন অনুসারে কমান্ড সম্প্রসারণ দ্বারা সরানো হয়েছে :

প্রতিস্থাপনের শেষে এক বা একাধিক অক্ষরের ক্রম সরিয়ে ফেলা হচ্ছে।


একটি পিছনে সম্পর্কে x

এই প্রশ্নে বলা হয়েছে যে কোনও একটি xএনকোডিংয়ে কিছু চরিত্রের পিছনের বাইট নিয়ে বিভ্রান্ত হতে পারে। তবে আমরা কীভাবে বা কোন চরিত্রটি কোনও ভাষায় কোনও সম্ভাব্য এনকোডিংয়ে আরও ভাল তা অনুমান করতে যাচ্ছি, এটি একটি কঠিন প্রস্তাব, অন্তত বলতে চাই।

যাহোক; এটি সহজভাবে ভুল

শুধুমাত্র নিয়ম যে আমরা অনুসরণ করতে হবে যোগ হয় ঠিক কি আমরা মুছে ফেলুন।

এটি বোঝা সহজ হওয়া উচিত যে আমরা যদি কোনও বিদ্যমান স্ট্রিংয়ে (বা বাইট ক্রম) কিছু যুক্ত করি এবং পরে আমরা ঠিক একই জিনিসটি সরিয়ে ফেলি তবে মূল স্ট্রিং (বা বাইট অনুক্রম) অবশ্যই একই হবে।

আমরা কোথায় ভুল করব? আমরা যখন অক্ষর এবং বাইটগুলি মিশ্রিত করি ।

আমরা যদি বাইট যুক্ত করি, আমাদের অবশ্যই একটি বাইট সরিয়ে ফেলতে হবে, আমরা যদি একটি অক্ষর যুক্ত করি তবে অবশ্যই আমাদের একই চরিত্রটি মুছে ফেলতে হবে ।

দ্বিতীয় বিকল্পটি, একটি অক্ষর যুক্ত করা (এবং পরে ঠিক একই চরিত্রটি মুছে ফেলা) সংশ্লেষিত এবং জটিল হয়ে উঠতে পারে এবং হ্যাঁ, কোড পৃষ্ঠা এবং এনকোডিংগুলি এগুলি পেতে পারে।

যাইহোক, প্রথম বিকল্পটি বেশ সম্ভব, এবং এটি ব্যাখ্যা করার পরে, এটি সহজ সরল হয়ে উঠবে।

আসুন একটি বাইট যুক্ত করুন, একটি এএসসিআইআই বাইট (<127), এবং জিনিসগুলি যতটা সম্ভব কম দোষযুক্ত রাখতে, আসুনের পরিসীমাতে একটি ASCII চরিত্রটি বলি। বা আমাদের যেমনটি বলা উচিত, হেক্স রেঞ্জের একটি বাইট 0x61- 0x7a। এর মধ্যে যে কোনও একটি বেছে নিতে দেয়, সম্ভবত একটি এক্স (সত্যই মূল্যবোধের বাইট 0x78)। আমরা স্ট্রিংয়ের সাথে এক্সকে কনটেটেট করে এর সাথে এই বাইট যুক্ত করতে পারি (ধরে নেওয়া যাক একটি é):

$ a
$ b=${a}x

যদি আমরা স্ট্রিংকে বাইটের ক্রম হিসাবে দেখি তবে আমরা দেখতে পাই:

$ printf '%s' "$b" | od -vAn -tx1c
  c3  a9  78
 303 251   x

একটি স্ট্রিং ক্রম যা একটি x এ শেষ হয়।

যদি আমরা সেই এক্স (বাইট মান 0x78) সরিয়ে ফেলি তবে আমরা পাই:

$ printf '%s' "${b%x}" | od -vAn -tx1c
  c3  a9
 303 251

এটি কোনও সমস্যা ছাড়াই কাজ করে।

আরেকটু কঠিন উদাহরণ।

বলুন যে আমরা যে স্ট্রিংটিতে আগ্রহী সেগুলি বাইটে শেষ হয় 0xc3:

$ a=$'\x61\x20\x74\x65\x73\x74\x20\x73\x74\x72\x69\x6e\x67\x20\xc3'

এবং মান বাইট যোগ করতে দিন 0xa9

$ b=$a$'\xa9'

স্ট্রিংটি এখন এটি হয়ে উঠেছে:

$ echo "$b"
a test string é

ঠিক আমি যা চেয়েছিলাম, শেষ দুটি বাইটগুলি ইউটিএফ 8- এর একটি চরিত্র (যাতে যে কেউ তাদের ইউটিএফ 8 কনসোলে এই ফলাফলগুলি পুনরুত্পাদন করতে পারে)।

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

বাইটদের চরিত্র হিসাবে ভুল ব্যাখ্যা করা এড়াতে আমাদের কী প্রয়োজন। আমাদের যা প্রয়োজন তা হ'ল একটি ক্রিয়া যা আমরা ব্যবহার করা বাইট সরিয়ে ফেলি 0xa9। প্রকৃতপক্ষে, ছাই, বাশ, লক্ষ এবং ম্যাক্স সকলেই ঠিক এমনটি করে বলে মনে হচ্ছে:

$ c=$'\xa9'
$ echo ${b%$c} | od -vAn -tx1c
 61  20  74  65  73  74  20  73  74  72  69  6e  67  20  c3  0a
  a       t   e   s   t       s   t   r   i   n   g     303  \n

তবে ksh বা zsh নয়।

তবে এটি সমাধান করা খুব সহজ, সেই সমস্ত শেলকে বাইট অপসারণ করতে বলুন :

$ LC_ALL=C; echo ${b%$c} | od -vAn -tx1c 

এটিই, সমস্ত শেলগুলি পরীক্ষার কাজ (যশ ব্যতীত) (স্ট্রিংয়ের শেষ অংশের জন্য):

ash             :    s   t   r   i   n   g     303  \n
dash            :    s   t   r   i   n   g     303  \n
zsh/sh          :    s   t   r   i   n   g     303  \n
b203sh          :    s   t   r   i   n   g     303  \n
b204sh          :    s   t   r   i   n   g     303  \n
b205sh          :    s   t   r   i   n   g     303  \n
b30sh           :    s   t   r   i   n   g     303  \n
b32sh           :    s   t   r   i   n   g     303  \n
b41sh           :    s   t   r   i   n   g     303  \n
b42sh           :    s   t   r   i   n   g     303  \n
b43sh           :    s   t   r   i   n   g     303  \n
b44sh           :    s   t   r   i   n   g     303  \n
lksh            :    s   t   r   i   n   g     303  \n
mksh            :    s   t   r   i   n   g     303  \n
ksh93           :    s   t   r   i   n   g     303  \n
attsh           :    s   t   r   i   n   g     303  \n
zsh/ksh         :    s   t   r   i   n   g     303  \n
zsh             :    s   t   r   i   n   g     303  \n

কেবল সহজ, শেলটিকে একটি এলসি_এলএল = সি অক্ষর অপসারণ করতে বলুন, যা থেকে সমস্ত বাইট মানের জন্য এক বাইট 0x00হয় 0xff

মন্তব্যের সমাধান:

মন্তব্যে আলোচিত উদাহরণের জন্য, একটি সম্ভাব্য সমাধান (যা zsh এ ব্যর্থ হয়) হ'ল:

#!/bin/bash

LC_ALL=zh_HK.big5hkscs

a=$(printf '\210\170');
b=$(printf '\170');

unset OldLC_ALL ; [ "${LC_ALL+set}" ] && OldLC_ALL=$LC_ALL
LC_ALL=C ; a=${a%"$b"};
unset LC_ALL ; [ "${OldLC_ALL+set}" ] && LC_ALL=$OldLC_ALL

printf '%s' "$a" | od -vAn -c

এটি এনকোডিংয়ের সমস্যাটি দূর করবে।


জেনে রাখা ভাল যে একাধিক পেছনের নতুন লাইন সরানো হতে পারে।
টম হেল


আমি একমত যে ${var%?}সর্বদা এক বাইট স্ট্রিপগুলি নিশ্চিত করার জন্য সিটিতে লোকেল ঠিক করা তাত্ত্বিক ক্ষেত্রে আরও সঠিক, তবে: 1- LC_ALLএবং LC_CTYPEওভাররাইড $LANG, সুতরাং আপনাকে LC_ALL=C2 সেট করতে var=${var%?}হবে - পরিবর্তনের ফলে আপনি সাব-শেল করতে পারবেন না হারিয়ে যেতে হবে, সুতরাং আপনার মান এবং অবস্থা সংরক্ষণ করতে এবং পুনরুদ্ধার করতে হবে LC_ALL(বা নন-পসিক্স localস্কোপ বৈশিষ্ট্যগুলি অবলম্বন করুন ) 3- স্ক্রিপ্টের মধ্য দিয়ে লোকাল মাঝখানে পরিবর্তন করা যশ এর মতো কয়েকটি শেলগুলিতে পুরোপুরি সমর্থিত নয়। অন্য প্রান্তে, .বাস্তবে বাস্তবে কখনও অক্ষর নয়, তাই এটি ব্যবহার করে এলসি_এলএল মিশ্রণ এড়ানো যায়।
স্টাফেন চেজেলাস

2

আপনি স্বাভাবিক আউটপুট পরে একটি অক্ষর আউটপুট করতে পারেন এবং তারপরে স্ট্রিপ করতে পারেন:

#capture the output of "$@" (arguments run as a command)
#into the exact_output` variable
exact_output() 
{
    exact_output=$( "$@" && printf X ) && 
    exact_output=${exact_output%X}
}

এটি একটি পসিক্স কমপ্লায়েন্ট সমাধান।


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