Zsh সর্বশেষ রান প্রোগ্রামের স্টাডাউট অ্যাক্সেস করতে পারেন?


16

আমি প্রায়শই ব্যবহার করি findবা locateপাথ সম্পর্কে সন্ধান করি।

(~) locate foobar.mmpz
/home/progo/lmms/projects/foobar.mmpz

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

(~) ls `!!`
ls `locate foobar.mmpz`
/home/progo/lmms/projects/foobar.mmpz

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

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

ঠিক আছে তাই এটি বেশ দুর্দান্ত: /unix//a/59704/5674 । আমি এখন প্রতিটি রান লাইনের পরে এই ধরণের ক্যাপচারটি ছুঁড়ে ফেলার জন্য zsh জেনে কীভাবে (এবং কোডটি zsh তে পোর্টিং) সম্পর্কে জিজ্ঞাসা করছি।


স্ট্রিমটি ব্যবহারকারীর কাছে পুনর্নির্দেশ করা সত্যিই শেলের কাজ নয়। অ্যাপ্লিকেশনগুলি আউটপুটটি টার্মিনাল ডিভাইসে লিখবে, শেল এতে জড়িত নয়।
স্টাফেন চেজেলাস

@ স্টাফেনচাজেলাস, তবে এটি ব্যবহারকারীর অনুরোধ অনুযায়ী ফাইলগুলিতে স্ট্রিমগুলি পুনঃনির্দেশ করা বলা শেলের কাজ। স্টেডআউট থেকে আলাদা করার জন্য লাল রঙের স্টার্ডার জেডশির জন্য রেসিপি রয়েছে। আমি মনে করি এটি স্ট্রিমিংয়ের ক্ষেত্রে শেলের ভূমিকা নির্দেশ করে।
unPress325680

হ্যাঁ, আপনি এটি ব্যবহার করতে পারে screenবা scriptএবং precmd এবং preexec আঙ্গুলসমূহ।
স্টাফেন চেজেলাস

উত্তর:


7

বেশিরভাগ টার্মিনাল এমুলেটরগুলিতে স্ক্রিন থেকে আউটপুট ক্যাপচার করার কোনও বৈশিষ্ট্য নেই। আমি xterm ("রেফারেন্স" টার্মিনাল এমুলেটর) এর লেখককে স্মরণ করে বলে মনে করি যে এটি প্রয়োগ করা কঠিন হবে। এমনকি যদি এটি সম্ভবও হত, শেলটি সর্বশেষ প্রম্পটটি কোথায় ছিল সে সম্পর্কে নজর রাখতে হবে।

সুতরাং আপনি যদি কমান্ডটি চালাতে না পারাতে পারবেন না, আপনি যদি টার্মিনাল-নির্দিষ্ট, ম্যানুয়াল পদ্ধতি যেমন এক্সটারমে মাউসের সাথে অনুলিপি বা স্ক্রিনের কীবোর্ডের সাহায্যে কপি-পেস্ট ব্যবহার না করেন।

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

আপনি কমান্ডটি পুনরায় চালাতে এবং এর আউটপুট ক্যাপচার করতে পারেন। প্রতিটি করার বিভিন্ন উপায় আছে। কমান্ডটি পুনরায় চালু করতে আপনি ব্যবহার করতে পারেন:

  • !! ইতিহাস প্রতিস্থাপন - টাইপ করতে সবচেয়ে সুবিধাজনক;
  • fc -e -, যা একটি ফাংশনে ব্যবহার করা যেতে পারে।

আউটপুট ক্যাপচার করতে, আপনি কমান্ড প্রতিস্থাপন, বা নিম্নলিখিত ফাংশন ব্যবহার করতে পারেন:

K () {
  lines=("${(f@)$(cat)}")
}
!! |K

এটি linesএর মধ্যে পাইপযুক্ত কমান্ডের আউটপুটটিতে অ্যারে সেট করে ।


তাই হোক। আমি এখন ভাল ব্যাখ্যার আলোকে বুঝতে পেরেছি যে সম্পূর্ণ স্বয়ংক্রিয় পদ্ধতির মতোই খুব কঠিন, দ্বিতীয় সেরা জিনিসটি Kআপনার মতো।
unPress325680

3

যাকে বলা চলকটিতে আউটপুটটির শেষ লাইন রাখার জন্য এখানে কোনও কিছুর প্রথম কাট $lastline

precmd () {                                                                                                                                                                                                        
    exec 2>&- >&-
    lastline=$(tail -1 ~/.command.out) 
    sleep 0.1   # TODO: synchronize better
    exec > /dev/tty 2>&1
}

preexec() {
    exec > >(tee ~/.command.out&)
}

এটি preexecচালাতে zsh এর হুক ব্যবহার execকরেtee , কমান্ড এর stdout- এ একটি কপি সংরক্ষণ করতে তারপর ব্যবহার precmdসঞ্চিত আউটপুট পড়া এবং stdout- এ পুনঃস্থাপন প্রম্পট দেখানোর জন্য মাত্র টার্মিনাল হতে হবে।

তবে এটি এখনও কিছু কাজ প্রয়োজন। উদাহরণস্বরূপ, যেহেতু stdout আর টার্মিনাল নয়, প্রোগ্রাম vimএবং যেমনless সঠিকভাবে কাজ করে না।

এই প্রশ্নগুলিতে কিছু দরকারী সম্পর্কিত তথ্য রয়েছে:


হ্যাঁ, সম্ভবত একটি 100% স্বয়ংক্রিয় পদ্ধতির কাজ হচ্ছে না। কোডটিতে অনেকগুলি execকল রয়েছে, কমান্ডটি একাধিকবার চলছে বা আমি বিশেষ শব্দার্থবিজ্ঞানে ধরা পড়েছি?
unPress325680

execকোনও প্রোগ্রামের নাম ছাড়াই কেবল পুনর্নির্দেশগুলি সেট করে।
মাইকেল

2

আপনি কেবল নিজের ফলাফলগুলিতে পাইপ দিয়ে এটি করতে পারেন tee, যা কেবলমাত্র একটি ফাইলে আউটপুট সংরক্ষণ করে এবং একই সাথে প্রদর্শন করে।

সুতরাং উদাহরণস্বরূপ, আপনি এটি করতে পারেন যা আপনার আউটপুটটিকে স্বাভাবিকের মতো দেখায়, তবে এটি ফাইলটিতেও সংরক্ষণ করে /tmp/it

locate foobar.mmpz | tee /tmp/it

তারপরে সেই ফাইলটিকে বিড়াল করুন এবং জিনিসগুলি নির্বাচন করতে গ্রেপ করুন, যেমন

cat /tmp/it | grep progo | grep lms

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

vi $(!!)


2

আমি এই অর্ধ-বেকড সমাধানটি নিয়ে এসেছি:

alias -g ___='"$(eval "$(fc -ln -1)" | tail -n 1)"'

এটি আপনাকে ___কমান্ড লাইনের যে কোনও সময়ে লিখতে দেয় to পূর্ববর্তী কমান্ডটি আবার চালানো ___হবে এবং এর আউটপুটটির শেষ লাইনটি প্রতিস্থাপন করা হবে। ব্যবহারের উদাহরণ:

$ touch foo bar baz
$ ls -1
bar
baz
foo
$ vim ___

শেষ কমান্ডটি প্রসারিত হবে vim foo

এর কিছু ধারালো প্রান্ত রয়েছে!

  • আপনি যদি ___কোনও কমান্ডে অন্তর্ভুক্ত করেন তবে আগের কমান্ডটিতে একটি অন্তর্ভুক্ত থাকলে ___শেলটি কিছুটা অদ্ভুত অবস্থায় কিছুক্ষণ স্থির হয়ে থাকবে। আপনি Ctrl- এর সাথে সাথে এই রাজ্য থেকে বেরিয়ে যেতে পারেন C

  • আপনি যেমনটি করতে পারেন এবং অন্যান্য Tabনির্মাণগুলি প্রসারিত করতে টিপতে পারবেন না can't___!$

  • কিছু "কমান্ডগুলি" সাধারণত "চালানো হয় এবং যখন তারা পাইপের সাথে সংযুক্ত থাকে তখন বিভিন্ন আউটপুট প্রদর্শিত হবে। (এর আউটপুট lsএবং এর সাথে তুলনা করুন ls | cat।) যদি কমান্ডটি ট্রিগার করে এর ___মধ্যে একটি হয় তবে আপনি প্রত্যাশার চেয়ে আলাদা কমান্ড চালিয়ে যেতে পারেন।

  • এবং অবশ্যই, যদি আপনি শেষটি ব্যতীত অন্য কোনও আউটপুট লাইনের সাথে কিছু করতে চান, এটি আপনাকে সাহায্য করবে না।

আমি নামটি বেছে নিয়েছি ___কারণ এটি এমন কোনও জিনিস যা আমি কখনও কমান্ড লাইনে একটি শব্দ হিসাবে অন্তর্ভুক্ত করতে চাইনি, এমনকি যুক্তি হিসাবেও না। আপনি অন্য কোনও নাম বাছাই করতে পারেন, তবে অযত্নে আপনার জন্য প্রসারিত হতে পারে এমন কোনও পছন্দ না করার বিষয়ে খেয়াল রাখুন।

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