সাধারণ সমস্যা
আমি এমন একটি স্ক্রিপ্ট লিখতে চাই যা পাইপের শৃঙ্খলের মাঝে থাকা সত্ত্বেও এটির সাথে ইন্টারেক্ট করে।
কংক্রিট উদাহরণ
কংক্রিটলি, এটি একটি fileবা stdin, লাইনগুলি প্রদর্শন করে (লাইন সংখ্যা সহ), ব্যবহারকারীকে একটি নির্বাচন বা লাইন সংখ্যা ইনপুট করতে বলে এবং তারপরে সংশ্লিষ্ট লাইনগুলি মুদ্রণ করে stdout। এই স্ক্রিপ্ট কল করুন selector। তারপর মূলত, আমি করতে সক্ষম হতে চাই
grep abc foo | selector > myfile.tmp
যদি fooথাকে
blabcbla
foo abc bar
quux
xyzzy abc
তারপরে অপশন সহ selectorআমাকে উপস্থাপন করুন (টার্মিনালে, না myfile.tmp!)
1) blabcbla
2) foo abc bar
3) xyzzy abc
Select options:
যার পরে আমি টাইপ করি
2-3
এবং শেষ পর্যন্ত
foo abc bar
xyzzy abc
বিষয়বস্তু হিসাবে myfile.tmp।
আমি একটি নির্বাচক স্ক্রিপ্ট পেয়েছি এবং চলমান আছে, এবং মূলত এটি পুরোপুরি কাজ করছে যদি আমি ইনপুট এবং আউটপুটটিকে পুনর্নির্দেশ না করি। সুতরাং
selector foo
আমি চাই যেমন আচরণ। তবে উপরের উদাহরণের মতো জিনিসগুলি একসাথে পাইপ করার সময় selectorউপস্থাপিত বিকল্পগুলি মুদ্রণ করে myfile.tmpএবং গ্রেপড ইনপুট থেকে একটি নির্বাচন পড়ার চেষ্টা করে।
আমার পদ্ধতির
আমি এর -uপতাকা readহিসাবে ব্যবহার করার চেষ্টা করেছি
exec 4< /proc/$PPID/fd/0
exec 4> /proc/$PPID/fd/1
nl $INPUT >4
read -u4 -p"Select options: "
তবে এটি আমি যা আশা করি তা করে না।
প্রশ্ন: আমি কীভাবে প্রকৃত ব্যবহারকারীর ইন্টারঅ্যাকশন পেতে পারি?
cmd | { some processing; read var </dev/tty; } | cmd
alias selector='{ TMPFILE=$(mktemp); cat > $TMPFILE; nl -s") " $TMPFILE | column -c $(tput cols); read -e -p"Select options: " < /dev/tty; rangeselect -v range="$REPLY" $TMPFILE; rm $TMPFILE; }'যা খুব ভাল কাজ করে। তবে grep b foo | selector | wc -lএখানে বিরতি। কোনও ধারণা কীভাবে এটি ঠিক করবেন? যাইহোক, rangeselectআমি যেটি ব্যবহার করেছি তা পেস্টবিন . com/ভিএক্সটিএসএসএইচে পাওয়া যাবে । এটি একটি সরল এডাব্লুকে স্ক্রিপ্ট যা লাইনেনারের একটি নির্দিষ্ট পরিসীমা সম্পর্কিত কোনও ফাইলের লাইনগুলি মুদ্রণ করে। (পরিসীমাগুলি "3-10, 12,14,16-20-20" এর মতো জিনিস হতে পারে))
aliasবরং যে selector() { all of that stuff...; }একটি ফাংশন মধ্যে। aliasস্প্যানিশ ভাষায় নামান্তর সহজ কমান্ড যেহেতু ফাংশন একটি প্যাক যৌগ কমান্ড একটি একক মধ্যে সহজ কমান্ড ।