পাইপ পরিবর্তনশীল বরাদ্দ করে


19

সরলতার জন্য আমি এটি করতে চাই:

echo cart | assign spo;
echo $spo  

আউটপুট: কার্ট

এ জাতীয় assignপ্রয়োগ কি বিদ্যমান?

প্রতিস্থাপন ব্যবহার করে এটি করার সমস্ত উপায় সম্পর্কে আমি অবগত।


আপনি বিকল্প ছাড়াই এটি করতে চান কেন?
থানাটোস

আমি কেবল পাইপ দিয়ে লেখার সময় বিপরীত পোলিশ স্বরলিপি প্রবাহ পছন্দ করি। আমি অনেক দ্রুত কোডিং করছি এবং কোডের মান / গতি এত গুরুত্বপূর্ণ নয়। এছাড়াও আমি শৃঙ্খলিত করার সময় শৃঙ্খলার অংশগুলি মন্তব্য করা এবং বর্তমান আউটপুট প্রতিধ্বনি করা বরং
টিক্সগুলি

আপনি যদি ডিবাগিংয়ের স্বাচ্ছন্দ্যের বিষয়ে উদ্বিগ্ন হন তবে ব্যাকটিক্স কমান্ডকে পৃথক পৃথক লাইনের ধারাবাহিকতায় রাখার বিষয়টি বিবেচনা করুন। A=$( some | command | here )প্রতিটি some |, command |এবং hereতার নিজস্ব লাইনে।
রোয়াইমা

উত্তর:


11
echo cart | { IFS= read -r spo; printf '%s\n' "$spo"; }

যতক্ষণ না কেবল একটি লাইন আউটপুট দেয় ততক্ষণ echoচলবে (চলকটিতে নতুন লাইনের চরিত্রটি ছাড়াই আউটপুট সংরক্ষণ করবে) Wouldspoecho

আপনি সর্বদা করতে পারেন:

assign() {
  eval "$1=\$(cat; echo .); $1=\${$1%.}"
}
assign spo < <(echo cart)

নিম্নলিখিত সমাধানগুলি bashস্ক্রিপ্টগুলিতে কাজ করবে তবে bashপ্রম্পটে নয়:

shopt -s lastpipe
echo cat | assign spo

বা:

shopt -s lastpipe
whatever | IFS= read -rd '' spo

whateverপ্রথম NUL টি অক্ষর পর্যন্ত আউটপুট সংরক্ষণ bashকরতে ( ভেরিয়েবলগুলি NUL অক্ষরগুলিকে কোনওভাবেই সংরক্ষণ করতে পারে না) $spo

বা:

shopt -s lastpipe
whatever | readarray -t spo

আউটপুট সংরক্ষণ করা whateverমধ্যে $spo অ্যারে (এক অ্যারের উপাদান প্রতি লাইনে)।


1
না তার মাঝে একটি স্পেস হওয়া উচিত IFS=এবং read?
সিজারসোল

সব শিলাবৃষ্টি শেষ পাইপ। এছাড়াও সাইড নোট সেট + এম (এআরএমএম বা-এম) একটি কমান্ড লাইন থেকে প্রয়োজনীয় যা সে শেষ নিয়ন্ত্রণটি সক্রিয়ভাবে কাজ নিয়ন্ত্রণের সাথে কাজ করে না'll
MageProspero

17

আপনি যদি এরকম কিছু করতে পারেন তবে bash:

echo cart | while read spo; do echo $spo; done

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

আপনি এটিটি কেএসএসে (পিডিক্স বা মিক্সে নয়) বা কল্পিত zsh তে প্রায় উপরে লিখেছেন এমনটি করতে পারেন:

% echo cart | read spo
% echo $spo
cart

সুতরাং, আর একটি সমাধান হ'ল ksh বা zsh ব্যবহার করা।


1
আপনি কর্ন শেল (উদাঃ mksh): তে echo cart |& while read -p spo; do echo $spo; donewhile IFS= read -p -r spo; do…
কপিরোসেস

2

আমি যদি সমস্যাটি সঠিকভাবে বুঝতে পারি তবে আপনি স্ট্রাউটকে একটি ভেরিয়েবলের কাছে পাইপ করতে চান। কমপক্ষে এটি আমি যা খুঁজছিলাম এবং এখানেই শেষ হয়েছিল। সুতরাং যারা আমার ভাগ্য ভাগ করে নেওয়ার জন্য:

spa=$(echo cart)

cartভেরিয়েবলকে বরাদ্দ দেয় $spa


2
এটিকে তারা বিকল্প হিসাবে ডাকে, যা ওপিকে এড়াতে চেয়েছিল।
দিমিত্রি গ্রিগরিয়েভ

এটি আমার জন্য দরকারী ছিল, আমার কেবল এটি একটি ভেরিয়েবলের জন্য বরাদ্দ করা দরকার, আমি কীভাবে পেলাম না যে এটি সেখানে কীভাবে পেল!
ক্রিস মেরিসিক

1

আপনি যদি কেবলমাত্র পাইপ স্ট্রিম ব্যবহারটি আউটপুট করতে চান cat

echo cart | cat 

আপনি যদি কমান্ড চেইন চালিয়ে যেতে চান teeতবে আউটপুট প্রতিধ্বনি করতে কমান্ডটি ব্যবহার করে চেষ্টা করুন ।

echo cart | tee /dev/tty | xargs ls

কমান্ডটি সংক্ষিপ্ত করতে আপনি একটি উপাধি ব্যবহার করতে পারেন।

alias tout='tee /dev/tty'
echo cart | tout | xargs ls

আপনি কেন একটি সমতল থেকে পাইপ আউটপুট চান cat?
রোয়াইমা

1
@ রোয়াইমা কিছু কমান্ড সনাক্ত করে যে তারা টার্মিনালে চালাচ্ছে এটি কোনও পাইপে আউটপুট আউট করার চেয়ে আলাদা আচরণ করে। বিশেষত তারা বর্তমান পর্দার প্রস্থে লাইনগুলি কেটে ফেলতে পারে। বেশিরভাগ কমান্ডের জন্য বিড়ালের কমান্ড অপ্রয়োজনীয়।
বিলথোর

আহ ঠিক আছে, আপনি এখন যা বোঝানোর চেষ্টা করছেন তা আমি এখন দেখতে পাচ্ছি। echo | catকনস্ট্রাক্ট আমাকে ফেলে দিল।
রোয়াইমা

1

এখানে আমার সমস্যার সমাধান।

# assign will take last line of stdout and create an environment variable from it
# notes: a.) we avoid functions so that we can write to the current environment
#        b.) aliases don't take arguments, but we write this so that the "argument" appears
#            behind the alias, making it appear as though it is taking one, which in turn
#            becomes an actual argument into the temporary script T2.
# example: echo hello world | assign x && echo %x outputs "hello world"
alias assign="tail -1|tee _T1>/dev/null&&printf \"export \\\$1=\$(cat _T1)\nrm _T*\">_T2&&. _T2"
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.