আমি দুটি কমান্ডের আউটপুট কীভাবে পৃথক করব?


165

দু'টি অনুরূপ ডিরেক্টরিগুলির বিষয়বস্তুগুলির তুলনা করার সহজ উপায়টি আমি কল্পনা করেছি

diff `ls old` `ls new`

তবে আমি দেখছি কেন এটি কাজ করে না; diffকমান্ড লাইনে ফাইলগুলির একটি দীর্ঘ দীর্ঘ তালিকা হস্তান্তর করা হচ্ছে, আমার মতো দুটি স্ট্রিমের চেয়ে। আমি কীভাবে দুটি আউটপুট সরাসরি পৃথক করতে পারি?


উত্তর:


245

কমান্ড প্রতিস্থাপন কমান্ডের `…`আউটপুটকে কমান্ড লাইনে প্রতিস্থাপন করে, সুতরাং diffউভয় ডিরেক্টরিতে ফাইলগুলির তালিকাটিকে আর্গুমেন্ট হিসাবে দেখায়। আপনি যা চান তা হ'ল diffএর কমান্ড লাইনে দুটি ফাইলের নাম দেখা এবং এই ফাইলগুলির বিষয়বস্তু ডিরেক্টরি তালিকাভুক্ত হওয়া উচিত। যে কি প্রক্রিয়া প্রতিকল্পন না।

diff <(ls old) <(ls new)

আর্গুমেন্টগুলি diffদেখতে দেখতে /dev/fd/3এবং /dev/fd/4: এগুলি বাশ দ্বারা নির্মিত দুটি পাইপের সাথে সম্পর্কিত ফাইল বর্ণনাকারী। যখন diffএই ফাইলগুলি খোলে, প্রতিটি পাইপের পঠিত পাশ থেকে সংযুক্ত হবেন। প্রতিটি পাইপের লেখার দিকটি lsকমান্ডের সাথে সংযুক্ত থাকে ।


49
echo <(echo) <(echo)কখনই ভাবিনি যে এটি এত আকর্ষণীয় হতে পারে: ডি
কুম্ভ শক্তি

3
প্রক্রিয়া প্রতিকল্পন হয় সব শাঁস দ্বারা সমর্থিত নয় , কিন্তু পাইপ পুনঃনির্দেশ একটি হয় ঝরঝরে কার্যসংক্রান্ত
ইরফান434

1
কেবল উল্লেখ করার জন্য যে এলএসকে পার্সিংয়ের
কাটু

@ কাতু সমস্যাটি lsহ'ল এটি ফাইলের নামগুলি ম্যাঙ্গেল করে । এর আউটপুট পার্স করা ভঙ্গুর (এটি "অদ্ভুত" ফাইলের নাম দিয়ে কাজ করে না)। দুটি ডিরেক্টরি তালিকার তুলনা করার জন্য, যতক্ষণ না আউটপুটটি দ্ব্যর্থহীন। যথেচ্ছ ফাইলের নাম সহ, এর জন্য একটি বিকল্পের প্রয়োজন হবে --quoting-style=escape
গিলস

1
@ উইল <(…)একটি পাইপ তৈরি করে। দেখে মনে হচ্ছে পাইপগুলি পাইয়া দিয়ে কাজ করে না, সুতরাং আপনি ব্যবহার করতে পারবেন না <(…)। Zsh, আপনি প্রতিস্থাপন করতে পারেন <(…)দ্বারা =(…)এবং কারণ এটি কাজ করবে =(…)একটি অস্থায়ী ফাইলের মধ্যে অন্তর্বর্তী আউটপুট রাখে। ব্যাশে আমি মনে করি না যে কোনও সুবিধাজনক বাক্য গঠন আছে, আপনাকে অস্থায়ী ফাইলগুলি নিজেই পরিচালনা করতে হবে।
গিলস

3

Zsh এর জন্য, =(command)স্বয়ংক্রিয়ভাবে ব্যবহার করা একটি অস্থায়ী ফাইল তৈরি করে এবং ফাইলের =(command)পাথের সাথে প্রতিস্থাপন করে। কমান্ড সাবস্টিটিউশন সহ, কমান্ডের আউটপুট$(command) সঙ্গে প্রতিস্থাপন করা হয় ।

সুতরাং তিনটি বিকল্প আছে:

  1. কমান্ড সাবস্টিটিউশন: $(...)
  2. প্রক্রিয়া প্রতিস্থাপন: <(...)
  3. zsh- স্বাদযুক্ত প্রক্রিয়া সাবস্টিটিউশন: =(...)

zsh স্বাদযুক্ত প্রক্রিয়া সাবস্ক্রিপশন, # 3, খুব দরকারী এবং একটি পৃথক সরঞ্জাম ব্যবহার করে দুটি কমান্ডের আউটপুট তুলনা করতে যেমন ব্যবহার করা যেতে পারে, উদাহরণস্বরূপ তুলনার বাইরে:

bcomp  =(ulimit -Sa | sort) =(ulimit -Ha | sort)

অপেক্ষাকৃত তুলনার bcompজন্য , নোট করুন যে আপনাকে তুলনামূলক প্রবর্তন করার bcompareপরে উপরের (পরিবর্তে ) ব্যবহার করতে হবে bcompএবং এটি সম্পূর্ণ হওয়ার জন্য অপেক্ষা করছে । যদি আপনি ব্যবহার করেন তবে bcompareএটি তুলনা আরম্ভ করে এবং তত্ক্ষণাত্ প্রস্থান করে যার কারণে কমান্ডগুলির আউটপুট সংরক্ষণের জন্য তৈরি অস্থায়ী ফাইলগুলি অদৃশ্য হয়ে যায়।

এখানে আরও পড়ুন: http://zsh.sourceforge.net/Intro/intro_7.html

এটিও লক্ষ্য করুন:

মনে রাখবেন যে শেলটি একটি অস্থায়ী ফাইল তৈরি করে এবং কমান্ডটি শেষ হয়ে গেলে এটি মুছে দেয়।

এবং zsh দ্বারা সমর্থিত প্রক্রিয়া প্রতিস্থাপনের দুই ধরণের (যেমন # 2 এবং # 3) এর মধ্যে পার্থক্যটি নিম্নলিখিত:

আপনি যদি zsh এর ম্যান পৃষ্ঠাটি পড়েন তবে আপনি লক্ষ্য করতে পারেন <(...) হ'ল প্রক্রিয়া প্রতিস্থাপনের অন্য রূপ যা = (...) এর অনুরূপ। দুজনের মধ্যে একটি গুরুত্বপূর্ণ পার্থক্য রয়েছে। <(...) ক্ষেত্রে, শেলটি একটি ফাইলের পরিবর্তে নামযুক্ত পাইপ (ফিফো) তৈরি করে। এটি আরও ভাল, যেহেতু এটি ফাইল সিস্টেম পূরণ করে না; তবে এটি সব ক্ষেত্রে কার্যকর হয় না। প্রকৃতপক্ষে, আমরা যদি উপরের উদাহরণগুলিতে <(...) এর সাথে প্রতিস্থাপন করে থাকি তবে fgrep -f <(...) ব্যতীত তাদের সমস্ত কাজ বন্ধ করে দেওয়া হত। আপনি কোনও পাইপ সম্পাদনা করতে বা মেল ফোল্ডার হিসাবে খুলতে পারবেন না; fgrep তবে পাইপ থেকে শব্দের তালিকা পড়তে সমস্যা নেই। আপনি ভাবতে পারেন যে foo | যেহেতু ডিফ <(foo) বারটি কেন কাজ করে না diff - বার কাজ করে; এর কারণ এই যে ডিফ একটি অস্থায়ী ফাইল তৈরি করে যদি এটি লক্ষ্য করে যে এর মধ্যে একটি আর্গুমেন্ট রয়েছে - এবং তারপরে অস্থায়ী ফাইলটিতে তার স্ট্যান্ডার্ড ইনপুটটি অনুলিপি করে।

তথ্যসূত্র: https://unix.stackexchange.com/questions/393349/differences-between-subshells-and-process-substटका


2
$(...)প্রক্রিয়া প্রতিস্থাপন নয়, এটি আদেশ প্রতিস্থাপন। <(...)প্রক্রিয়া প্রতিস্থাপন হয়। সে কারণেই উদ্ধৃত অনুচ্ছেদে মোটেও উল্লেখ করা $(...)হয়নি।
মুড়ু

2

ফিশ শেল

ফিশ শেল এ আপনাকে পিপতে হবে । এখান থেকে heroku এবং dokku কনফিগ তুলনা একটি উদাহরণ বিয়ন্ড তুলনা :

bcompare (ssh me@myapp.pl dokku config myapp | sort | psub) (heroku config -a myapp | sort | psub)

1
আর একটি গ্রাফিকাল ডিফ ডিভাইস meldযা ওপেন সোর্স এবং উবুন্টু এবং ইপিইএল সংগ্রহস্থলগুলিতে উপলভ্য। meldmitted.org
ফিলিফি

0

আমি প্রায়শই গৃহীত উত্তরে বর্ণিত কৌশলটি ব্যবহার করি:

diff <(ls old) <(ls new)

তবে আমি দেখতে পাই যে আমি সাধারণত এটি উপরের উদাহরণের চেয়ে অনেক বেশি জটিল কমান্ড সহ ব্যবহার করি। এই ধরনের ক্ষেত্রে এটি পৃথক কমান্ডটি কারুকাজ করা বিরক্তিকর হতে পারে। আমি এমন কিছু সমাধান নিয়ে এসেছি যা অন্যরা দরকারী হতে পারে।

আমি দেখতে পাই যে 99% সময় পার্থক্য চালানোর আগে প্রাসঙ্গিক আদেশগুলি চেষ্টা করে দেখি। ফলস্বরূপ যে আদেশগুলি আমি পৃথক করতে চাই তা আমার ইতিহাসে ঠিক আছে ... কেন সেগুলি ব্যবহার করবেন না?

আমি শেষ দুটি কমান্ড কার্যকর করতে ফিক্স কমান্ড (এফসি) ব্যাश বিল্টিন ব্যবহার করি:

$ echo A
A
$ echo B
B
$ diff --color <( $(fc -ln -1 -1) ) <( $(fc -ln -2 -2 ) )
1c1
< B
---
> A

এফসি পতাকাগুলি হল:

-n : কোন নম্বর নেই। তালিকাভুক্ত করার সময় এটি কমান্ড নম্বরগুলিকে দমন করে।

-l : তালিকাবদ্ধকরণ: আদেশগুলি স্ট্যান্ডার্ড আউটপুটে তালিকাভুক্ত করা হয়।

The -1 -1গত কমান্ড যা শুধু গত কমান্ড উৎপাদ গত হুকুম থেকে এই ক্ষেত্রে তার মধ্যে ইতিহাসের শুরুর এবং শেষের positing পড়ুন।

অবশেষে আমরা $()একটি সাব-শেলের কমান্ডটি কার্যকর করতে এটি মোড়ানো করি ।

স্পষ্টতই এটি টাইপ করতে কিছুটা ব্যথা হয় যাতে আমরা একটি নাম তৈরি করতে পারি:

alias dl='diff --color <( $(fc -ln -1 -1) ) <( $(fc -ln -2 -2 ) )'

অথবা আমরা একটি ফাংশন তৈরি করতে পারি:

dl() {
    if [[ -z "$1" ]]; then
        first="1"
    else
        first="$1"
    fi
    if [[ -z "$2" ]]; then
        last="2"
    else
        last="$2"
    fi
    # shellcheck disable=SC2091
    diff --color <( $(fc -ln "-$first" "-$first") ) <( $(fc -ln "-$last" "-$last") )
}

যা ব্যবহার করার জন্য ইতিহাসের রেখাগুলি নির্দিষ্ট করে সমর্থন করে। উভয় ব্যবহারের পরে আমি খুঁজে পেয়েছি যে উপন্যাসটি আমার পছন্দ করা সংস্করণ।

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