বলুন আমার খুব প্রোগ্রাম আছে a
এবং b
আমি ./a
এবং সাথে চালাতে পারি ./b
।
অস্থায়ী ফাইলগুলিতে প্রথমে লিখিত না লিখে কি তাদের আউটপুটগুলি আলাদা করা সম্ভব?
বলুন আমার খুব প্রোগ্রাম আছে a
এবং b
আমি ./a
এবং সাথে চালাতে পারি ./b
।
অস্থায়ী ফাইলগুলিতে প্রথমে লিখিত না লিখে কি তাদের আউটপুটগুলি আলাদা করা সম্ভব?
উত্তর:
<(command)
একটি কমান্ডের আউটপুট অন্য প্রোগ্রামে পাস করার জন্য ব্যবহার করুন যেন এটি কোনও ফাইলের নাম। বাশ প্রোগ্রামের আউটপুটটিকে একটি পাইপে পাইপ দেয় এবং /dev/fd/63
বাইরের কমান্ডের মতো একটি ফাইলের নাম দেয় ।
diff <(./a) <(./b)
আপনি >(command)
যদি কমান্ডের মধ্যে কিছু পাইপ করতে চান তবে একইভাবে আপনি ব্যবহার করতে পারেন ।
এটিকে বাশের ম্যান পেজে "প্রক্রিয়া সাবস্টিটিউশন" বলা হয়।
-bash: syntax error near unexpected token ('
। আমি প্রথম বন্ধনী ছাড়াই আবার চেষ্টা করেছি এবং পেয়েছি -bash: java: No such file or directory
। কমান্ডের প্যারামিটার থাকলে এটি কাজ করে না?
alias diffcmd bash -c \'diff \<\(sh -c \!:1\) \<\( sh -c \!:2 \)\'
। (তারপরে উদাহরণস্বরূপ: diffCmd "ls" "ls -a")।
fseek
, জেডএস অফার =(./a)
যা <(./a)
হুডের নীচে একটি অস্থায়ী ফাইল ব্যবহার করে যা একইভাবে ব্যবহার করা যেতে পারে , যা zsh আপনার জন্য মুছে
উভয় উত্তর যুক্ত করা, আপনি পাশাপাশি তুলনা পাশাপাশি দেখতে চান, ব্যবহার করুন vimdiff
:
vimdiff <(./a) <(./b)
এটার মতো কিছু:
vimdiff
সুন্দর, স্মার্ট এবং ইন্টারেক্টিভ পার্থক্য তুলনা ভিউ তৈরি করে। এটি vim
বেশিরভাগ সিস্টেমে প্যাকেজটি নিয়ে আসে বলে মনে হয় ।
vimdiff
এছাড়াও কেবল পৃথক পৃথক লাইনটি নয় তবে নির্দিষ্ট পাঠ্য খণ্ডটিও পৃথক করে।
একটি বিকল্প হ'ল নামযুক্ত পাইপ (FIFOs) ব্যবহার করা হবে :
mkfifo a_fifo b_fifo
./a > a_fifo &
./b > b_fifo &
diff a_fifo b_fifo
... তবে জন কুগেলম্যানের সমাধানটি অনেক পরিষ্কার।
rm a_fifo b_fifo
।
কৌতূহলী যে কারও জন্য, আপনি ফিশ শেলটি ব্যবহারের ক্ষেত্রে প্রক্রিয়া প্রতিস্থাপনটি এভাবেই করেন :
ব্যাশ:
diff <(./a) <(./b)
মাছ:
diff (./a | psub) (./b | psub)
দুর্ভাগ্যক্রমে মাছের প্রয়োগের বর্তমানে অভাব রয়েছে ; মাছ হয় হয় স্তব্ধ বা ডিস্কে একটি অস্থায়ী ফাইল ব্যবহার করবে। আপনি আপনার কমান্ড থেকে আউটপুট জন্য psub ব্যবহার করতে পারবেন না।
ইতিমধ্যে ভাল উত্তরগুলিতে আরও কিছু যুক্ত করা (আমাকে সহায়তা করেছে!):
কমান্ডটি docker
তার সাহায্যের ফলাফল দেয় STD_ERR
(উদাহরণস্বরূপ ফাইল বর্ণনাকারী 2)
আমি দেখতে চেয়েছিলাম docker attach
এবং docker attach --help
একই আউটপুট দিয়েছি কিনা
$ docker attach
$ docker attach --help
এই দুটি কমান্ড সবেমাত্র টাইপ করে আমি নিম্নলিখিতটি করেছি:
$ diff <(!-2 2>&1) <(!! 2>&1)
!! ! -1 এর সমান যা এর আগে 1 কমান্ডটি চালায় - শেষ কমান্ড
! -2 এর অর্থ কমান্ডটি এটির আগে দুটি চালান
2> & 1 এর অর্থ ফাইল_ডেস্কিটার 2 আউটপুট (এসটিডি_আরআর) ফাইল_ডেস্কিটার 1 আউটপুট (এসটিডি_আউট) হিসাবে একই জায়গায় পাঠান
আশা করি এটি কিছুটা কাজে লাগবে।
Zsh এর জন্য, =(command)
স্বয়ংক্রিয়ভাবে ব্যবহার করা একটি অস্থায়ী ফাইল তৈরি করে এবং ফাইলের =(command)
পাথের সাথে প্রতিস্থাপন করে। সাধারণ প্রক্রিয়া সাবস্টিটিউশন সহ, কমান্ডের আউটপুট$(command)
দ্বারা প্রতিস্থাপিত হয় ।
এই zsh বৈশিষ্ট্যটি খুব দরকারী এবং একটি পৃথক সরঞ্জাম ব্যবহার করে দুটি কমান্ডের আউটপুট তুলনা করতে যেমন ব্যবহার করা যেতে পারে উদাহরণস্বরূপ তুলনার বাইরে:
bcomp =(ulimit -Sa | sort) =(ulimit -Ha | sort)
অপেক্ষাকৃত তুলনার bcomp
জন্য , নোট করুন যে আপনাকে তুলনাটি আরম্ভ করার bcompare
পরে অবশ্যই উপরের (পরিবর্তে ) ব্যবহার করতে হবে bcomp
এবং এটি সম্পূর্ণ হওয়ার জন্য অপেক্ষা করছে । যদি আপনি ব্যবহার করেন তবে bcompare
এটি তুলনা আরম্ভ করে এবং ততক্ষনে প্রস্থান করে যার ফলে কমান্ডগুলির আউটপুট সংরক্ষণের জন্য তৈরি অস্থায়ী ফাইলগুলি অদৃশ্য হয়ে যায়।
এখানে আরও পড়ুন: http://zsh.sourceforge.net/Intro/intro_7.html
এটিও লক্ষ্য করুন:
মনে রাখবেন যে শেলটি একটি অস্থায়ী ফাইল তৈরি করে এবং কমান্ডটি শেষ হয়ে গেলে এটি মুছে দেয়।
এবং নিচের যার মধ্যে পার্থক্য নেই $(...)
এবং =(...)
:
আপনি যদি zsh এর ম্যান পৃষ্ঠাটি পড়েন তবে আপনি লক্ষ্য করতে পারেন <(...) হ'ল প্রক্রিয়া প্রতিস্থাপনের অন্য রূপ যা = (...) এর অনুরূপ। দুজনের মধ্যে একটি গুরুত্বপূর্ণ পার্থক্য রয়েছে। <(...) ক্ষেত্রে, শেলটি একটি ফাইলের পরিবর্তে নামযুক্ত পাইপ (ফিফো) তৈরি করে। এটি আরও ভাল, যেহেতু এটি ফাইল সিস্টেম পূরণ করে না; তবে এটি সব ক্ষেত্রে কার্যকর হয় না। প্রকৃতপক্ষে, আমরা যদি উপরের উদাহরণগুলিতে <(...) এর সাথে প্রতিস্থাপন করে থাকি তবে fgrep -f <(...) ব্যতীত তাদের সমস্ত কাজ বন্ধ করে দেওয়া হত। আপনি কোনও পাইপ সম্পাদনা করতে বা মেল ফোল্ডার হিসাবে খুলতে পারবেন না; fgrep তবে পাইপ থেকে শব্দের তালিকা পড়তে সমস্যা নেই। আপনি ভাবতে পারেন যে কেন foo | থেকে ডিফ <(foo) বার কাজ করে না diff - বার কাজ করে; এর কারণ এই যে ডিফ একটি অস্থায়ী ফাইল তৈরি করে যদি এটি লক্ষ্য করে যে এর মধ্যে একটি আর্গুমেন্ট রয়েছে - এবং তারপরে অস্থায়ী ফাইলটিতে তার স্ট্যান্ডার্ড ইনপুটটি অনুলিপি করে।