কেন `সাজানো <" $ f1 "` কে `সাজানো -" $ f1 "over এর চেয়ে বেশি পছন্দ করা হয় এবং কেন এটি" $ f1 "over এর চেয়ে বেশি পছন্দ করা হয়?


29

Https://unix.stackexchange.com/a/458074/674 থেকে

-- কমান্ডগুলিতে স্বেচ্ছাসেবী যুক্তিগুলি পাস করার সময় ব্যবহার করতে ভুলবেন না (বা যেখানে সম্ভব সেখানে পুনর্নির্দেশগুলি ব্যবহার করুন)। তাই sort -- "$f1"বা ভাল sort < "$f1"পরিবর্তে sort "$f1"

কেন এটি ব্যবহার --এবং পুনঃনির্দেশ পছন্দ?

কেন sort < "$f1"বেশি পছন্দ করা হয় sort -- "$f1"?

কেন sort -- "$f1"বেশি পছন্দ করা হয় sort "$f1"?

ধন্যবাদ।


উত্তর:


55
sort "$f1"

শুরু হওয়া কিছুগুলির $f1সাথে -বা এখানে শুরু হওয়া মানগুলির ক্ষেত্রে ব্যর্থ sortহয় +( -o/etc/passwdউদাহরণস্বরূপ বলা ফাইলের জন্য গুরুতর পরিণতি হতে পারে )।

sort -- "$f1"

(যেখানে -- বিকল্পগুলির শেষের ইঙ্গিত দেয়) সেগুলি বেশিরভাগ ক্ষেত্রে সম্বোধন করে তবে এখনও ফাইলটির জন্য ব্যর্থ হয় -(যা sortপরিবর্তে এর স্টিডিনকে ব্যাখ্যা করে)।

sort < "$f1"

এই সমস্যাগুলি নেই।

এখানে, এটি খোলা ফাইলটি শেল। এর অর্থ হ'ল যদি ফাইলটি খোলা না যায় তবে আপনি একটি সম্ভাব্য আরও কার্যকর ত্রুটি বার্তাও পাবেন (উদাহরণস্বরূপ, বেশিরভাগ শেলগুলি স্ক্রিপ্টের লাইন নম্বরটি নির্দেশ করবে), এবং যদি আপনি ব্যবহার করেন ত্রুটি বার্তাটি সামঞ্জস্য থাকবে ফাইলগুলি খুলতে যেখানেই সম্ভব পুনর্নির্দেশগুলি।

এবং ভিতরে

sort < "$f1" > out

(বিপরীতে sort -- "$f1" > out), যদি "$f1"না খোলা যায় outতবে তৈরি করা হবে না / কেটে যাবে এবং sortচালানো হবে না ।

কিছু সম্ভাব্য বিভ্রান্তি দূর করার জন্য (নীচে মন্তব্যগুলি অনুসরণ করে), যা ফাইলটি নিজের মধ্যে অনুসন্ধানযোগ্য হতে পারে তবে কমান্ডটি ফাইলটি প্রবেশ করানো mmap()বা এর lseek()অভ্যন্তরে প্রবেশ করতে বাধা দেয় না sortprovided পার্থক্যটি হ'ল ফাইলটি প্রথমে এবং শেল দ্বারা ফাইল বর্ণনাকারী 0 এ পরে খোলা হয় সম্ভবত পরবর্তী ফাইল বর্ণনাকারীর দ্বারা কমান্ডের বিপরীতে। কমান্ডটি এখনও তার পছন্দ মতো এমডি এমডি করতে পারে / এমডি করতে পারে। এটি বিভ্রান্ত হওয়ার দরকার নেই cat file | cmdযেখানে এই সময়ের cmdস্টিডিন এমন একটি পাইপ যা এমএমএপ / সন্ধান করা যায় না।


4
কেবল মনে রাখবেন যে ডায়রেক্ট্রেশনটি ব্যবহার sortকরে ডেটা ক্রমহীনভাবে পড়তে পারে এবং আপনি mmapফাইলটি করতে পারবেন না । যদিও sortএটা দিয়ে অনেক সমস্যা নাও হতে পারে, কর্মক্ষমতা বিবেচনা less <fileএবং less file। প্রথম ক্ষেত্রে lessফাইলের পুরো বিষয়বস্তু মেমোরিতে রাখতে হয়, দ্বিতীয় ক্ষেত্রে এটি কেবল যে অংশগুলি চায় তা পড়তে দেয়। এখন কল্পনা করুন যে fileএটি একটি 100 গিগাবাইট লগ ফাইল ...
স্টায়ারফোম ফ্লাই

7
@ স্টাইরোফোমফ্লাই: এটি সঠিক যে less <fileসমস্ত ফাইল মেমোরিতে রাখে, তবে বাধ্য করা হয় না, এটি হ'ল কম। শুধুমাত্র cat file | lessবাধ্য করা হয়। চেক আউট করুন less /dev/fd/0 <f, যা স্টিডিনে এলেও এটি মেমরিতে রাখে না memory এটি একটি সাধারণ ভুল ধারণা যে ইউনিক্সে স্টিডিন অদৃশ্যযোগ্য। এটি প্রকৃতপক্ষে, ফাইলের ধরণের উপর নির্ভর করে এটি অনুসন্ধানযোগ্য হতে পারে।
pts

@styrofoamfly আপনার অর্থ কি read()কোনও ফাইল থেকে ক্রমান্বয়ে ডেটা mmap()পড়া, পুরো ফাইলটি একবারে মেমরিতে পড়ার সময় ?
টিম

1
জিএনউউ প্রকল্পটি শুরুর আগে ১৯৮০ সালে সিসিআইআই থেকে গিওপট হিসাবে কমপক্ষে ফিরে আসা জন জনিবোলিংগার নং, পসিক্স সহ বেশিরভাগ স্ট্যান্ডার্ড ইউটিলিটির জন্য সমর্থন করার প্রয়োজন রয়েছে sort। তবে এটি সত্য যে এটি সর্বদা সমর্থিত নয়।
স্টাফেন চ্যাজেলাস

2
আমার ক্ষমা, @ স্টাফেনচাজেলাস, আপনি কনভেনশনটির উত্স সম্পর্কে সঠিক, এবং আমি আরও দৃp়ভাবে বলব যে getopt()সি ফাংশনের জন্য পসিক্স স্পেসিফিকেশন যুক্তির এই তাত্পর্যকে স্বীকৃতি দেয় --। তবে মূল বিষয়টি হ'ল আপনি যা গ্রহণ করেন: যুক্তি হ্যান্ডলিং হ'ল স্বতন্ত্র প্রোগ্রামগুলির ডোমেন, এবং সমস্তই --বিশেষভাবে আচরণ করে না।
জন বলিঞ্জার

17

সমস্যাটি হ'ল ড্যাশ দিয়ে শুরু ফাইলের নাম। sort "$f1"মানটি f1শুরু হলে কাজ করে না -কারণ কমান্ডটি বিকল্প হিসাবে মানটিকে ব্যাখ্যা করবে। এটি সাধারণত একটি ত্রুটির ফলাফল করে তবে এটি এমনকি কোনও সুরক্ষা গর্তের কারণ হতে পারে । এর সাথে sort -- "$f1", ডাবল ড্যাশ যুক্তিটির --অর্থ "এই বিন্দুর বাইরে কোনও বিকল্প নেই" সুতরাং এর মানটিকে f1বিকল্প হিসাবে ব্যাখ্যা করা হবে না। তবে এখনও একটি প্রান্তের মামলা রয়েছে: যদি মানটি f1কোনও ড্যাশ এবং অন্য কিছু না হয় তবে এটি কোনও বিকল্প নয়, এটি যুক্তিটির -অর্থ, "স্ট্যান্ডার্ড ইনপুট" (কারণ আর্গুমেন্ট একটি ইনপুট ফাইল; আউটপুট ফাইলের জন্য) এর অর্থ হবে "স্ট্যান্ডার্ড আউটপুট")।

পুনঃনির্দেশ ব্যবহার করা এই সমস্ত সমস্যাগুলি এড়িয়ে চলে।

এটি কেবলমাত্র নয়, বেশিরভাগ আদেশের ক্ষেত্রেও প্রযোজ্য sort


আপনি কি বলছেন যে sort < "$f1"মানটি সমান হলে কাজ করবে -? এটি আমি চেষ্টা করেছি এমন কোনও শেলের মধ্যে নেই।
মাধ্যাকর্ষণ

@grawity, তুলনা seq 10 > -; sort -সঙ্গে seq 10 > -; sort < -
স্টাফেন চ্যাজেলাস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.