অস্থায়ী ফাইল ব্যতীত দুটি প্রোগ্রাম থেকে পৃথক আউটপুট


145

বলুন আমার খুব প্রোগ্রাম আছে aএবং bআমি ./aএবং সাথে চালাতে পারি ./b

অস্থায়ী ফাইলগুলিতে প্রথমে লিখিত না লিখে কি তাদের আউটপুটগুলি আলাদা করা সম্ভব?


উত্তর:


211

<(command)একটি কমান্ডের আউটপুট অন্য প্রোগ্রামে পাস করার জন্য ব্যবহার করুন যেন এটি কোনও ফাইলের নাম। বাশ প্রোগ্রামের আউটপুটটিকে একটি পাইপে পাইপ দেয় এবং /dev/fd/63বাইরের কমান্ডের মতো একটি ফাইলের নাম দেয় ।

diff <(./a) <(./b)

আপনি >(command)যদি কমান্ডের মধ্যে কিছু পাইপ করতে চান তবে একইভাবে আপনি ব্যবহার করতে পারেন ।

এটিকে বাশের ম্যান পেজে "প্রক্রিয়া সাবস্টিটিউশন" বলা হয়।


1
সচেতন হওয়ার জন্য একটি অপূর্ণতা হ'ল যদি। / এ বা। / বি ব্যর্থ হয়, কলকারী এটি খুঁজে পাবে না।
আলেকজান্ডার পোগ্রেবন্যাক

5
ওপিতে প্রশ্ন বাশকে ট্যাগ করেছে, তবে রেকর্ডের জন্য, এটি অন্য কোনও শেলটিতে কাজ করে না। এটি প্যাসিক্স ইউটিলিটি স্ট্যান্ডার্ডটিতে বাশ এক্সটেনশন।
ডিজিটালরোস

5
আমি একটি জাভা প্রোগ্রামের সাথে এই সমাধান চেষ্টা এবং এই ত্রুটিটি পেয়েছিলেন: -bash: syntax error near unexpected token ('। আমি প্রথম বন্ধনী ছাড়াই আবার চেষ্টা করেছি এবং পেয়েছি -bash: java: No such file or directory। কমান্ডের প্যারামিটার থাকলে এটি কাজ করে না?
styfle

1
@ ডিজিটালরোস - সমাধানটি একটি উপনাম ব্যবহার করে অন্যান্য শেলগুলিতে বাড়ানো যেতে পারে। Tcsh শেল, নিম্নলিখিত কদর্যতা কাজ করে: alias diffcmd bash -c \'diff \<\(sh -c \!:1\) \<\( sh -c \!:2 \)\'। (তারপরে উদাহরণস্বরূপ: diffCmd "ls" "ls -a")।
পল লিঞ্চ

গুগল বন্ধে যে কারও জন্য ঘুরে বেড়ানো, এটি zsh এর অধীনেও কাজ করে। (এছাড়াও, যদি আপনাকে এমন কিছুতে ইনপুট ফিড করতে হয় যা কল করে fseek, জেডএস অফার =(./a)যা <(./a)হুডের নীচে একটি অস্থায়ী ফাইল ব্যবহার করে যা একইভাবে ব্যবহার করা যেতে পারে , যা zsh আপনার জন্য মুছে
ফেলবে

26

উভয় উত্তর যুক্ত করা, আপনি পাশাপাশি তুলনা পাশাপাশি দেখতে চান, ব্যবহার করুন vimdiff:

vimdiff <(./a) <(./b)

এটার মতো কিছু:

এখানে চিত্র বর্ণনা লিখুন


vimdiffসুন্দর, স্মার্ট এবং ইন্টারেক্টিভ পার্থক্য তুলনা ভিউ তৈরি করে। এটি vimবেশিরভাগ সিস্টেমে প্যাকেজটি নিয়ে আসে বলে মনে হয় ।
টিম ভিসি

vimdiffএছাড়াও কেবল পৃথক পৃথক লাইনটি নয় তবে নির্দিষ্ট পাঠ্য খণ্ডটিও পৃথক করে।
আন্তন তারাসেনকো

20

একটি বিকল্প হ'ল নামযুক্ত পাইপ (FIFOs) ব্যবহার করা হবে :

mkfifo a_fifo b_fifo
./a > a_fifo &
./b > b_fifo &
diff a_fifo b_fifo

... তবে জন কুগেলম্যানের সমাধানটি অনেক পরিষ্কার।


নামযুক্ত পাইপগুলি ব্যবহার করার পরে আপনি সেগুলি আরও ভালভাবে সরিয়ে ফেলতে চাইবেন rm a_fifo b_fifo
ফ্র্যাঙ্কলিন ইউ

15

কৌতূহলী যে কারও জন্য, আপনি ফিশ শেলটি ব্যবহারের ক্ষেত্রে প্রক্রিয়া প্রতিস্থাপনটি এভাবেই করেন :

ব্যাশ:

diff <(./a) <(./b)

মাছ:

diff (./a | psub) (./b | psub)

দুর্ভাগ্যক্রমে মাছের প্রয়োগের বর্তমানে অভাব রয়েছে ; মাছ হয় হয় স্তব্ধ বা ডিস্কে একটি অস্থায়ী ফাইল ব্যবহার করবে। আপনি আপনার কমান্ড থেকে আউটপুট জন্য psub ব্যবহার করতে পারবেন না।


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

7

ইতিমধ্যে ভাল উত্তরগুলিতে আরও কিছু যুক্ত করা (আমাকে সহায়তা করেছে!):

কমান্ডটি 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 আউটপুট (এসটিডি_আউট) হিসাবে একই জায়গায় পাঠান

আশা করি এটি কিছুটা কাজে লাগবে।


0

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 - বার কাজ করে; এর কারণ এই যে ডিফ একটি অস্থায়ী ফাইল তৈরি করে যদি এটি লক্ষ্য করে যে এর মধ্যে একটি আর্গুমেন্ট রয়েছে - এবং তারপরে অস্থায়ী ফাইলটিতে তার স্ট্যান্ডার্ড ইনপুটটি অনুলিপি করে।

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