উত্তর:
cat /dev/null > file.txtএকটি হল বিড়াল বেহুদা ব্যবহার ।
মূলত কিছুই আউটপুট আউট cat /dev/nullফলস্বরূপ cat। হ্যাঁ এটি কাজ করে, তবে এটি অনেকের দ্বারাই ভ্রূণুভূত হয় কারণ এর ফলে এমন বাহ্যিক প্রক্রিয়া শুরু হয় যা প্রয়োজনীয় নয়।
এটি সেগুলির মধ্যে একটি যা সাধারণ কারণ এটি সাধারণ।
জাস্ট ব্যবহার > file.txtকরা বেশিরভাগ শেলগুলিতে কাজ করবে তবে এটি সম্পূর্ণ পোর্টেবল নয়। আপনি যদি পুরোপুরি পোর্টেবল চান তবে নিম্নলিখিত ভাল বিকল্পগুলি:
true > file.txt
: > file.txt
উভয় :এবং trueআউটপুট কোনও তথ্য নয়, এবং এটি শেল বিল্টিনস (যেখানে catএকটি বাহ্যিক ইউটিলিটি), সুতরাং এগুলি হালকা এবং আরও 'যথাযথ' হয়।
হালনাগাদ:
যেমনটি তার মন্তব্যে টাইলার উল্লেখ করেছেন, সেখানেও রয়েছে >| file.txt বাক্য ।
বেশিরভাগ শেলের একটি সেটিংস থাকে যা তাদের মাধ্যমে কোনও বিদ্যমান ফাইল কেটে যাওয়া থেকে রোধ করবে >। >|পরিবর্তে আপনার অবশ্যই ব্যবহার করা উচিত । এটি হ'ল মানুষের ত্রুটি প্রতিরোধ করার জন্য যখন আপনি সত্যিকারের সাথে যুক্ত হতে চান >>। আপনি আচরণটি চালু করতে পারেনset -C ।
সুতরাং এর সাথে, আমি মনে করি কোনও ফাইল কেটে ফেলার সবচেয়ে সহজ, সবচেয়ে সঠিক এবং পোর্টেবল পদ্ধতিটি হ'ল:
:>| file.txt
:অন্তর্নির্মিত করার জন্য বাধ্যতামূলক করেছেন এবং বাস্তবে trueএটি একটি "বিশেষ" অন্তর্নির্মিত হিসাবে বিবেচিত হয় ।
>| fileএকটি আরও স্পষ্ট কাটা কাটা।
trueকোনটি অন্তর্নির্মিত হওয়ার দরকার নেই এবং এটি প্রচলিতভাবে ছিল না n't :বোর্ন পরিবারের সমস্ত শেলগুলিতে তৈরি। :পসিক্স প্রতি একটি বিশেষ অন্তর্নির্মিত (যাতে পসিক্স শেলগুলিতে লেখার জন্য উন্মুক্ত না : > fileহলে উদাহরণস্বরূপ শেলটি প্রস্থান করবে file) এবং trueতা নয়। পসিএক্স এমনকি উল্লেখ করেছে যা কিছু সিস্টেমের চেয়ে :বেশি দক্ষ হতে পারে true।
Bourne POSIX zsh csh/tcsh rc/es fish
> file Y Y N(1) N(1) N N
: > file N/Y(2) Y(3) Y Y(4) N(5) N(5)
true > file Y(5) Y Y Y(5) Y(5) Y(5)
cat /dev/null > file Y(5) Y Y(5) Y(5) Y(5) Y(5)
eval > file Y(3,8) Y(3) Y Y(6) Y Y
cp /dev/null file (7) Y(5) Y Y(5) Y(5) Y(5) Y(5)
printf '' > file Y(5) Y Y Y(5) Y(5) Y
নোট:
shবা kshশুধুমাত্র ফেরৎ stdin একটি কমান্ড zsh, একটি ডিফল্ট কমান্ড অধিকৃত হয় ছাড়া এমুলেশন, পুনঃনির্দেশগুলি জন্য (ক পেজার,cat অন্যথায়), যে NULLCMD এবং READNULLCMD ভেরিয়েবল সঙ্গে টিউন করা যাবে। এটি একই বৈশিষ্ট্য থেকে অনুপ্রাণিত(t)csh:ইউনিক্সভি 7 :- তে সম্পাদিত হয়নি কারণ একটি মন্তব্য নেতা এবং নাল কমান্ডের মধ্যে অর্ধেকভাবে ব্যাখ্যা করা হয়েছিল। পরে সেগুলি ছিল এবং সমস্ত বিল্টিনের মতো, যদি পুনঃনির্দেশটি ব্যর্থ হয় তবে শেলটি প্রস্থান করে।:এবং evalবিশেষ বিল্ট-ইনগুলি হচ্ছে, যদি পুনঃনির্দেশটি ব্যর্থ হয়, যা শেলটি থেকে বেরিয়ে আসে (bash কেবল এটি পসিক্স মোডে থাকে)।(t)cshএকটি নাল লেবেল সংজ্ঞায়িত করছে (এর জন্য goto), তাইgoto '' সেখানে শাখা হবে। যদি পুনঃনির্দেশটি ব্যর্থ হয় তবে শেলটি প্রস্থান করে।$PATH( :সাধারণত নয়; true, cat, cpএবং printfসাধারণত (POSIX তাদের প্রয়োজন))।fileকোনও অ-বিদ্যমান ফাইলের একটি সিমিলিংক হয় তবে জিএনইউ'র cpমতো কিছু বাস্তবায়ন এটি তৈরি করতে অস্বীকার করবে।(এই বিভাগটি অত্যন্ত বিষয়গত)
> file। এটি >দেখতে অনেকটা প্রম্পট বা মন্তব্যের মতো। এছাড়াও যে প্রশ্নটি পড়তে আমি জিজ্ঞাসা করব (এবং বেশিরভাগ শেলগুলি একই সম্পর্কে অভিযোগ করবে) আপনি কোন আউটপুটটি পুনঃনির্দেশিত করছেন?।: > file। :কোন অপ-কমান্ড হিসাবে পরিচিত। যাতে খালি ফাইল তৈরি করার সাথে সাথেই এটি পড়ে। তবে, এখানে আবার, :সহজেই মিস হয়ে যায় এবং / বা প্রম্পট হিসাবে দেখা যায়।true > file: বুলিয়ান পুনর্নির্দেশ বা ফাইলের সামগ্রীর সাথে কী করতে পারে? এখানে কি বোঝানো হয়েছে? আমি যখন এটি পড়ি তখন প্রথম জিনিসটি আমার মনে আসে।cat /dev/null > file। CONCATENATE /dev/nullমধ্যে file? catপ্রায়ই কমান্ড ফাইলের বিষয়বস্তু ডাম্প হিসেবে দেখা হচ্ছে, যে এখনও জানার জন্য করতে পারেন: বিষয়বস্তুর ডাম্প মধ্যে খালি ফাইলfile , একটি সংবর্ত উপায় মত একটি বিট বলতে cp /dev/null fileকিন্তু এখনও বোধগম্য।cp /dev/null file। কপি বিষয়বস্তু খালি ফাইল থেকে file। বোধগম্য হয়, যদিও cpডিফল্টরূপে কীভাবে বোঝানো হচ্ছে কেউ না জেনে মনে করতে পারে আপনি fileএকটি nullডিভাইসও তৈরি করার চেষ্টা করছেন ।eval > fileবা eval '' > file। কিছুই চালায় না এবং এর আউটপুটটিকে ক file। এ পুনঃনির্দেশ করে । আমার কাছে যৌক্তিক. আশ্চর্যের বিষয় যে এটি কোনও সাধারণ প্রতিমা নয়।printf '' > file: কোনও ফাইলের মধ্যে স্পষ্টতই কিছু মুদ্রণ করে না। যে আমার কাছে সর্বাধিক বোধ করে।পার্থক্যটি হ'ল আমরা শেল বিল্টিন ব্যবহার করছি কিনা তা। যদি তা না হয় তবে একটি প্রক্রিয়া কাঁটাতে হবে, কমান্ডটি লোড এবং কার্যকর করা হবে।
evalসমস্ত শেল নির্মিত হবে গ্যারান্টিযুক্ত। :এটি যেখানেই উপলব্ধ সেখানে অন্তর্নির্মিত (বোর্ন / সিএস লাইক)। trueকেবল বোর্নের মতো শেলগুলিতে নির্মিত।
printfবিল্ট-ইন সর্বাধিক আধুনিক বোর্নের মতো শেল এবং fish।
cpএবং catসাধারণত অন্তর্নির্মিত হয় না।
এখন cp /dev/null fileশেল পুনর্নির্দেশগুলি প্রেরণা দেয় না, তাই জিনিসগুলির মতো:
find . -exec cp /dev/null {} \;
এর চেয়ে আরও দক্ষ হতে চলেছে:
find . -exec sh -c '> "$1"' sh {} \;
(যদিও এর চেয়ে অগত্যা নয়:
find . -exec sh -c 'for f do : > "$f"; done' sh {} +
)।
ব্যক্তিগতভাবে, আমি : > fileবোর্নের মতো শেলগুলি ব্যবহার করি এবং আজকাল বোর্নের মতো শেল ছাড়া অন্য কিছু ব্যবহার করি না।
dd of=file count=0?
dd(সোলারিস কমপক্ষে 10 এর মতো) count=0এড়ানো হবে। dd if=/dev/null of=fileআরও বহনযোগ্য হবে। যে কোনও ক্ষেত্রে, এটি শেল থেকে স্বতন্ত্র।
cp /dev/null file, তাই না?
cp /dev/null fileএকটি সাধারণ প্রতিমা । আমি তাদের মধ্যে সীমাবদ্ধ করছি, পয়েন্টটি সমস্ত সম্ভাব্য উপায়ে তালিকাভুক্ত নয়।
আপনি দেখতে চাইতে পারেন truncate, যা হুবহু এটি করে: একটি ফাইল কেটে ফেলুন।
উদাহরণ স্বরূপ:
truncate --size 0 file.txt
এটি সম্ভবত ব্যবহারের চেয়ে ধীর true > file.txt।
তবে আমার মূল truncateবক্তব্যটি হ'ল: ফাইলগুলি কাটানোর উদ্দেশ্যে করা হয়েছে, ব্যবহার করার সময়> কোনও ফাইল কেটে যাওয়ার পার্শ্ব প্রতিক্রিয়া রয়েছে।
truncateপাওয়া যাবে, কিন্তু তন্ন তন্ন >না unistdসি লাইব্রেরি পাওয়া যাবে তো?
truncateহ'ল একটি ফ্রিবিএসডি ইউটিলিটি, তুলনামূলকভাবে সম্প্রতি (২০০৮) জিএনইউ কোর্টিলগুলিতে যুক্ত হয়েছে (যদিও --sizeজিএনইউ লম্বা বিকল্পের স্টাইলটি জিএনইউ নির্দিষ্ট), তবে এটি নন-জিএনইউ-বা-ফ্রিবিএসডি সিস্টেমগুলিতে উপলভ্য নয়, এবং এটি পুরানো জিএনইউ সিস্টেমে উপলব্ধ নয়, আমি এটি পোর্টেবল বলতে চাই না। cp /dev/null fileশেল পুনর্নির্দেশ ছাড়াই কাজ করবে এবং আরও বহনযোগ্য হবে।
উত্তরটি কী হবে file.txtতার উপর কিছুটা নির্ভর করে এবং কীভাবে প্রক্রিয়া এটিতে লিখিত!
আমি একটি সাধারণ ব্যবহারের কেস উদ্ধৃত করব: আপনার একটি ক্রমবর্ধমান লগফিল রয়েছে file.txtএবং এটি ঘোরানো যেতে চান।
সুতরাং আপনি অনুলিপি করুন, উদাহরণস্বরূপ, এর file.txtমধ্যে file.txt.save, তারপর কাটা file.txt।
এই দৃশ্যে , যদি ফাইলটি ফাইলটি না খোলেন another_process( another_processউদাহরণস্বরূপ that ফাইলটিতে প্রোগ্রাম আউটপুটিং হতে পারে, উদাহরণস্বরূপ কোনও প্রোগ্রাম কোনও লগিং করতে পারে), তবে আপনার 2 টি প্রস্তাব সমতুল্য, এবং উভয়ই ভাল কাজ করে (তবে ২ য়টি হিসাবে পছন্দসই প্রথম "বিড়াল / দেব / নাল> file.txt" হ'ল বিড়ালের একটি অকেজো ব্যবহার এবং এটি খোলে এবং পাঠায় / দেব / নাল)।
তবে আসল সমস্যাটি other_processহ'ল যদি এটি এখনও সক্রিয় থাকে এবং এখনও ফাইল.txt এ যাওয়ার একটি খোলা হ্যান্ডেল থাকে।
তারপরে, other processফাইলটি কীভাবে খোলা তার উপর নির্ভর করে 2 টি প্রধান কেস দেখা দেয় :
যদি other_processএটি সাধারণ উপায়ে খোলে, তবে হ্যান্ডেলটি এখনও ফাইলের পূর্ববর্তী অবস্থানটির দিকে নির্দেশ করবে, উদাহরণস্বরূপ অফসেট 1200 বাইটে। পরবর্তী লেখাগুলি 1200 অফসেটে শুরু হবে এবং 1200 নেতৃস্থানীয় শূন্য অক্ষরের সাথে আপনার আবার 1200bytes (+ অন্য যাই হোক না কেন প্রসেস লিখেছেন) একটি ফাইল থাকবে! আপনি যা চান তা নয় , আমি অনুমান করি।
যদি "সংযোজন মোড" এ other_processখোলা থাকে file.txt, তবে প্রতিবার এটি লিখলে পয়েন্টার সক্রিয়ভাবে ফাইলটির শেষের দিকে চেষ্টা করবে। অতএব, আপনি এটি কেটে ফেললে, এটি বাইট 0 অবধি "সন্ধান" করবে এবং আপনার খারাপ পার্শ্ব প্রতিক্রিয়া হবে না! এটিই আপনি চান (... সাধারণত!)
মনে রাখবেন যে এর অর্থ আপনার যখন প্রয়োজন হয়, যখন আপনি কোনও ফাইল কেটে ফেলেন তখন নিশ্চিত হয়ে নিন যে other_processসেই স্থানে এখনও লেখার সমস্ত বিষয়গুলি "সংযোজন" মোডে খুলেছে। অন্যথায় আপনাকে other_processএগুলি থামিয়ে দিতে হবে এবং এগুলি আবার শুরু করতে হবে, যাতে তারা পূর্বের অবস্থানের পরিবর্তে ফাইলের শুরুতে পয়েন্ট করা শুরু করে।
তথ্যসূত্র: /programming//a/16720582/1841533 একটি ক্লিনার ব্যাখ্যার জন্য, এবং /programming//a/984761/1841533 এ সাধারণ এবং অ্যাপড মোড লগিংয়ের মধ্যে পার্থক্যের একটি দুর্দান্ত সংক্ষিপ্ত উদাহরণ
cat /dev/null > fileএবং a এর মধ্যে পার্থক্য > fileহ'ল cat /dev/nullফাইলের সাথে কোনও পার্থক্য নেই।
আমি এটি পছন্দ করি এবং প্রায়শই এটি ব্যবহার করি কারণ এটি ক্লিয়ার বলে মনে হচ্ছে এবং দুর্ঘটনাক্রমে কেউ রিটার্ন কীটি মারার মতো নয়:
echo -n "" > file.txt
খুব অন্তর্নির্মিত হওয়া উচিত?
echoবাস্তবায়নের সমর্থন করি না -n(এবং আউটপুট would -n<SPC><NL>এখানে। printf '' > file.txtআরো (পোর্টেবল অন্তত আধুনিক / POSIX সিস্টেম জুড়ে হবে)।