কমান্ড থেকে কোনও ফাইল এবং আউটপুট কীভাবে আলাদা করা যায়?


32

সাধারণত আপনি লিখতে হবে:

diff file1 file2

তবে আমি কমান্ড থেকে একটি ফাইল এবং আউটপুট পৃথক করতে চাই (এখানে আমি কমান্ডকে একটি তুচ্ছ একটি হিসাবে তৈরি করি):

diff file1 <(cat file2 | sort)

ঠিক আছে, আমি যখন শেল প্রম্পটে এটি ম্যানুয়ালি প্রবেশ করি তখন এই কাজটি করা হয়, তবে আমি যখন শেল স্ক্রিপ্টে ঠিক একই লাইনটি রেখেছি এবং তখন স্ক্রিপ্টটি চালাচ্ছি তখন আমার ত্রুটি হয়।

সুতরাং, প্রশ্নটি হল - কীভাবে এটি সঠিকভাবে করবেন?

অবশ্যই আমি একটি অস্থায়ী ফাইলে আউটপুট লেখা এড়াতে চাই।

উত্তর:


39

আমি সন্দেহ করি আপনার স্ক্রিপ্ট এবং আপনার শেল পৃথক। সম্ভবত #!/bin/shআপনার স্ক্রিপ্টের শীর্ষে দোভাষী হিসাবে থাকলেও আপনি bashনিজের ব্যক্তিগত শেল হিসাবে ব্যবহার করছেন । আপনি টার্মিনালে কী শেল চালনা করে তা আবিষ্কার করতে পারেন echo $SHELL

এটি করার একটি সহজ উপায় যা বেশিরভাগ শাঁস জুড়ে কাজ করা উচিত তা হ'ল আপনার দেওয়া ফাইল রিড অপারেটরের পরিবর্তে একটি পাইপ পুনর্নির্দেশ ব্যবহার করা। প্রতীক '-' STDIN পড়ার জন্য একটি প্রমিত নাম এবং এটি প্রায়শই একটি যুক্তি তালিকার একটি ফাইলের নামের জন্য প্রতিস্থাপন হিসাবে ব্যবহার করা যেতে পারে:

cat file2 | sort | diff file1 -

বা বিড়ালের অকেজো ব্যবহার এড়াতে :

sort < file2 | diff file1 -

আহ, আপনি ভাল, প্রকৃতপক্ষে, আমি sh বাশ কিনা তা আমি পরীক্ষা করে দেখিনি। সমাধানের জন্য আপনাকে অনেক ধন্যবাদ।
গ্রিনোল্ডম্যান

এটি স্টডআউট সহ ফাইলটি পৃথক করছে। এখন কিভাবে একটি ফাইল সঙ্গে stdout পার্থক্য? আমি বলতে চাইছি, বিপরীত দিক। এটি -Rব্যবহারের ক্ষেত্রেgit diff --no-index
নাকিলন

@Nakilon আপনি শুধু যুক্তি ক্রম পরিবর্তন হবে: diff - file1
কালেব

কুল। এটি কাজ করে না git diff
নাকিলন

@ নকিলন অবশ্যই না, কেন হবে? git diffএকটি সম্পূর্ণ ভিন্ন প্রাণী এবং এটি তার অভ্যন্তরীণ সূচীতে গ্লোব অবজেক্টের রেফারেন্সে কাজ করে, ফাইল নয়; diffফাইল সিস্টেমে কাজ করে। -সিনট্যাক্স ঠিক অন্বিত চিনি শেল হয় /dev/stdin, ফাইল stdin প্রবাহ উপস্থাপন করে। সুতরাং কেন diffএটি একটি ফাইল নামের বিকল্প হিসাবে ব্যবহার করতে পারে। এদিকে git diffফাইলগুলি সন্ধান করছে না, এটি অবজেক্টগুলি সন্ধান করছে যাতে এটি আপনাকে স্বীকৃতি দেয় এমন কিছু পাস করতে হবে। একে অপরের সাথে ফাইলের তুলনা করতে এটি ব্যবহার করবেন না, তার diffজন্য ব্যবহার করুন ।
কালেব

-4

এটি স্বয়ংক্রিয় স্ক্রিপ্টের স্ট্যান্ডার্ড ইনপুটটির সুযোগ, সুতরাং আপনার কোডটিকে এই জাতীয় ব্লকের ভিতরে রাখুন:

{
  diff file1 <(sort file2)
}

এইভাবে এটি ব্লকটির মধ্যে এসটিডিনের সুযোগ রয়েছে ..

আমি চেষ্টা করেছি এবং এটি কাজ করে।


এটি কোনও ফাংশন নয়, এটি একটি ব্লক, এবং এটি কোনও পার্থক্য করে না।
গিলস 23'55

সংশোধনের জন্য @ গিলিস থেক্স। বিটিডব্লিউ আমি নিজে চেষ্টা করেছি এবং এটি কাজ করে। তুমি কি?
6:59 এ tmow

3
ব্লকটি <(…)নির্মাণের বৈধতার উপর কোনও প্রভাব ফেলবে না । আপনার স্ক্রিপ্টটি কাজ করে বা কাজ করবে না আপনি নির্ভর করে এমন শেলটি চালান কিনা তা নির্ভর করে <(…)(ksh93 / bash / zsh বনাম বোর্ন / অ্যাশ / kshk88)। কালেবের উত্তরটি সব নখ করে দেয়।
গিলস

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