কোনও ফাইলকে শূন্য করতে বিড়াল এবং '>' এর মধ্যে পার্থক্য


23

এই দুটি কমান্ড কীভাবে ফাইলগুলি জিরো-ইনগিংয়ে যায় সে সম্পর্কে কী আলাদা? দ্বিতীয়টি কি পূর্বের করার একটি ছোট উপায়? পর্দার আড়ালে কী হচ্ছে?

উভয়

$ cat /dev/null > file.txt

$ > file.txt 

উত্পাদ

-rw-r--r--  1 user  wheel  0 May 18 10:33 file.txt

উত্তর:


28

cat /dev/null > file.txtএকটি হল বিড়াল বেহুদা ব্যবহার

মূলত কিছুই আউটপুট আউট cat /dev/nullফলস্বরূপ cat। হ্যাঁ এটি কাজ করে, তবে এটি অনেকের দ্বারাই ভ্রূণুভূত হয় কারণ এর ফলে এমন বাহ্যিক প্রক্রিয়া শুরু হয় যা প্রয়োজনীয় নয়।
এটি সেগুলির মধ্যে একটি যা সাধারণ কারণ এটি সাধারণ।

জাস্ট ব্যবহার > file.txtকরা বেশিরভাগ শেলগুলিতে কাজ করবে তবে এটি সম্পূর্ণ পোর্টেবল নয়। আপনি যদি পুরোপুরি পোর্টেবল চান তবে নিম্নলিখিত ভাল বিকল্পগুলি:

true > file.txt
: > file.txt

উভয় :এবং trueআউটপুট কোনও তথ্য নয়, এবং এটি শেল বিল্টিনস (যেখানে catএকটি বাহ্যিক ইউটিলিটি), সুতরাং এগুলি হালকা এবং আরও 'যথাযথ' হয়।

 

হালনাগাদ:

যেমনটি তার মন্তব্যে টাইলার উল্লেখ করেছেন, সেখানেও রয়েছে >| file.txt বাক্য ।

বেশিরভাগ শেলের একটি সেটিংস থাকে যা তাদের মাধ্যমে কোনও বিদ্যমান ফাইল কেটে যাওয়া থেকে রোধ করবে >>|পরিবর্তে আপনার অবশ্যই ব্যবহার করা উচিত । এটি হ'ল মানুষের ত্রুটি প্রতিরোধ করার জন্য যখন আপনি সত্যিকারের সাথে যুক্ত হতে চান >>। আপনি আচরণটি চালু করতে পারেনset -C

সুতরাং এর সাথে, আমি মনে করি কোনও ফাইল কেটে ফেলার সবচেয়ে সহজ, সবচেয়ে সঠিক এবং পোর্টেবল পদ্ধতিটি হ'ল:

:>| file.txt

2
কোলন কমান্ডটি পসিক্সে সংজ্ঞায়িত করা হয় । কমান্ডলাইন আরগগুলি প্রসারিত করার জন্য এটি একটি নাল অপারেশন exists
কোজিরো

3
এলএল, "বিড়ালের অপব্যবহার"
কেএম।

2
@ কোজিরোও পসিক্স :অন্তর্নির্মিত করার জন্য বাধ্যতামূলক করেছেন এবং বাস্তবে trueএটি একটি "বিশেষ" অন্তর্নির্মিত হিসাবে বিবেচিত হয়
jw013

2
Noclobber সম্পর্কে ভুলবেন না । >| fileএকটি আরও স্পষ্ট কাটা কাটা।
টাইলার

1
trueকোনটি অন্তর্নির্মিত হওয়ার দরকার নেই এবং এটি প্রচলিতভাবে ছিল না n't :বোর্ন পরিবারের সমস্ত শেলগুলিতে তৈরি। :পসিক্স প্রতি একটি বিশেষ অন্তর্নির্মিত (যাতে পসিক্স শেলগুলিতে লেখার জন্য উন্মুক্ত না : > fileহলে উদাহরণস্বরূপ শেলটি প্রস্থান করবে file) এবং trueতা নয়। পসিএক্স এমনকি উল্লেখ করেছে যা কিছু সিস্টেমের চেয়ে :বেশি দক্ষ হতে পারে true
স্টাফেন চেজেলাস

23

বহনযোগ্যতার ক্ষেত্রে:

                      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

নোট:

  1. ছাড়া shবা kshশুধুমাত্র ফেরৎ stdin একটি কমান্ড zsh, একটি ডিফল্ট কমান্ড অধিকৃত হয় ছাড়া এমুলেশন, পুনঃনির্দেশগুলি জন্য (ক পেজার,cat অন্যথায়), যে NULLCMD এবং READNULLCMD ভেরিয়েবল সঙ্গে টিউন করা যাবে। এটি একই বৈশিষ্ট্য থেকে অনুপ্রাণিত(t)csh
  2. পুনঃনির্দেশগুলি প্রাথমিকভাবে :ইউনিক্সভি 7 :- তে সম্পাদিত হয়নি কারণ একটি মন্তব্য নেতা এবং নাল কমান্ডের মধ্যে অর্ধেকভাবে ব্যাখ্যা করা হয়েছিল। পরে সেগুলি ছিল এবং সমস্ত বিল্টিনের মতো, যদি পুনঃনির্দেশটি ব্যর্থ হয় তবে শেলটি প্রস্থান করে।
  3. :এবং evalবিশেষ বিল্ট-ইনগুলি হচ্ছে, যদি পুনঃনির্দেশটি ব্যর্থ হয়, যা শেলটি থেকে বেরিয়ে আসে (bash কেবল এটি পসিক্স মোডে থাকে)।
  4. মজার বিষয় হল, এটি (t)cshএকটি নাল লেবেল সংজ্ঞায়িত করছে (এর জন্য goto), তাইgoto '' সেখানে শাখা হবে। যদি পুনঃনির্দেশটি ব্যর্থ হয় তবে শেলটি প্রস্থান করে।
  5. যদি না / যদি সংশ্লিষ্ট কমান্ড পাওয়া যায় $PATH( :সাধারণত নয়; true, cat, cpএবং printfসাধারণত (POSIX তাদের প্রয়োজন))।
  6. যদি পুনঃনির্দেশটি ব্যর্থ হয় তবে শেলটি প্রস্থান করে।
  7. যদি fileকোনও অ-বিদ্যমান ফাইলের একটি সিমিলিংক হয় তবে জিএনইউ'র cpমতো কিছু বাস্তবায়ন এটি তৈরি করতে অস্বীকার করবে।
  8. বোর্ন শেলের প্রাথমিক সংস্করণগুলি যদিও বিল্টিনগুলিকে পুনর্নির্দেশের পক্ষে সমর্থন করে না

সুশাসনের ক্ষেত্রে:

(এই বিভাগটি অত্যন্ত বিষয়গত)

  • > file। এটি >দেখতে অনেকটা প্রম্পট বা মন্তব্যের মতো। এছাড়াও যে প্রশ্নটি পড়তে আমি জিজ্ঞাসা করব (এবং বেশিরভাগ শেলগুলি একই সম্পর্কে অভিযোগ করবে) আপনি কোন আউটপুটটি পুনঃনির্দেশিত করছেন?
  • : > file:কোন অপ-কমান্ড হিসাবে পরিচিত। যাতে খালি ফাইল তৈরি করার সাথে সাথেই এটি পড়ে। তবে, এখানে আবার, :সহজেই মিস হয়ে যায় এবং / বা প্রম্পট হিসাবে দেখা যায়।
  • true > file: বুলিয়ান পুনর্নির্দেশ বা ফাইলের সামগ্রীর সাথে কী করতে পারে? এখানে কি বোঝানো হয়েছে? আমি যখন এটি পড়ি তখন প্রথম জিনিসটি আমার মনে আসে।
  • cat /dev/null > fileCONCATENATE /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?
কোজিরো

2
@ কোজিরো, কিছু বাস্তবায়নের সাথে dd(সোলারিস কমপক্ষে 10 এর মতো) count=0এড়ানো হবে। dd if=/dev/null of=fileআরও বহনযোগ্য হবে। যে কোনও ক্ষেত্রে, এটি শেল থেকে স্বতন্ত্র।
স্টাফেন চেজেলাস

ঠিক আছে, তবে এটি অন্তর্ভুক্তির চেয়ে কম যোগ্য নয় cp /dev/null file, তাই না?
কোজিরো

2
@ কোজিরো, cp /dev/null fileএকটি সাধারণ প্রতিমা । আমি তাদের মধ্যে সীমাবদ্ধ করছি, পয়েন্টটি সমস্ত সম্ভাব্য উপায়ে তালিকাভুক্ত নয়।
স্টাফেন চেজেলাস

5

আপনি দেখতে চাইতে পারেন truncate, যা হুবহু এটি করে: একটি ফাইল কেটে ফেলুন।

উদাহরণ স্বরূপ:

truncate --size 0 file.txt

এটি সম্ভবত ব্যবহারের চেয়ে ধীর true > file.txt

তবে আমার মূল truncateবক্তব্যটি হ'ল: ফাইলগুলি কাটানোর উদ্দেশ্যে করা হয়েছে, ব্যবহার করার সময়> কোনও ফাইল কেটে যাওয়ার পার্শ্ব প্রতিক্রিয়া রয়েছে।


2
Truncate চমৎকার যখন আপনি 0. ছাড়া অন্য কিছু যে বলেন করার জন্য একটি ফাইল অগ্রভাগ ছাঁটিয়া করতে চান, এমনকি ছাড়া একটি শেল একটি অদ্ভুত বিবৃতি হল: আপনি বর্ণনা করতে পারেন একটি প্রেক্ষাপটে যেখানে truncateপাওয়া যাবে, কিন্তু তন্ন তন্ন >না unistdসি লাইব্রেরি পাওয়া যাবে তো?
কোজিরো

আসলে তা না. উপলব্ধ প্রতিটি স্ক্রিপ্ট বা প্রোগ্রামিং ভাষার জন্য সম্ভবত আরও মার্জিত সমাধান রয়েছে।
ফ্যাবিয়ান

3
truncateহ'ল একটি ফ্রিবিএসডি ইউটিলিটি, তুলনামূলকভাবে সম্প্রতি (২০০৮) জিএনইউ কোর্টিলগুলিতে যুক্ত হয়েছে (যদিও --sizeজিএনইউ লম্বা বিকল্পের স্টাইলটি জিএনইউ নির্দিষ্ট), তবে এটি নন-জিএনইউ-বা-ফ্রিবিএসডি সিস্টেমগুলিতে উপলভ্য নয়, এবং এটি পুরানো জিএনইউ সিস্টেমে উপলব্ধ নয়, আমি এটি পোর্টেবল বলতে চাই না। cp /dev/null fileশেল পুনর্নির্দেশ ছাড়াই কাজ করবে এবং আরও বহনযোগ্য হবে।
স্টাফেন চেজেলাস

ঠিক আছে, আমি সেই বহনযোগ্যতা মন্তব্যটি সরিয়ে দেব। যদিও আপনার সাম্প্রতিক সংজ্ঞাটি পৃথক বলে মনে হচ্ছে।
ফ্যাবিয়ান

2

উত্তরটি কী হবে 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 এ সাধারণ এবং অ্যাপড মোড লগিংয়ের মধ্যে পার্থক্যের একটি দুর্দান্ত সংক্ষিপ্ত উদাহরণ


2
এই উত্তরটির খুব সামান্যই প্রশ্নটির সাথে সম্পর্কিত বা উত্তর দেয়। A cat /dev/null > fileএবং a এর মধ্যে পার্থক্য > fileহ'ল cat /dev/nullফাইলের সাথে কোনও পার্থক্য নেই।
jw013

@ jw013: সত্য! তবে আমি কেবল "আপনি কী চান / আপনি কি চান না" তথ্যটি পুনরায় জানাতে এই প্রশ্নের সুযোগটি গ্রহণ করতে চেয়েছিলেন, কারণ এটি খুব বেশি পরিচিত নয়, এবং লগগুলি ঘোরানোর চেষ্টা করে এমন কাউকে আঘাত করতে পারে (একটি সাধারণ ক্ষেত্রে যেখানে আপনি চান) একটি ফাইল কেটে দিন)।
অলিভিয়ার ডুলাক

1
প্রত্যেক কিছুর জন্য একটি সময় এবং জায়গা আছে। আপনার তথ্য অন্য কোনও প্রসঙ্গে দরকারী হতে পারে তবে এটি এখানে অন্তর্ভুক্ত নয় - আপনার জন্য এটির জন্য আরও উপযুক্ত জায়গাটি খুঁজে পাওয়া উচিত কারণ লগগুলি ঘোরানোর চেষ্টা করছেন না কেউ এই সম্পূর্ণ সম্পর্কহীন পুনঃনির্দেশ প্রশ্নটিতে যাচ্ছেন না। এখানে আপনার উত্তরটি ডিজিটাল আগাছার সমতুল্য, ঠিক যেমন কর্নফিল্ডের মাঝখানে একটি অন্যথায় দরকারী কুমড়ো গাছকে আগাছা হিসাবে বিবেচনা করা হবে।
jw013

1

আমি এটি পছন্দ করি এবং প্রায়শই এটি ব্যবহার করি কারণ এটি ক্লিয়ার বলে মনে হচ্ছে এবং দুর্ঘটনাক্রমে কেউ রিটার্ন কীটি মারার মতো নয়:

echo -n "" > file.txt

খুব অন্তর্নির্মিত হওয়া উচিত?


3
একটি ফাইল শূন্য আউট করার অনেক উপায় আছে। আমার মনে হয় কে। প্রশ্নটিতে প্রদর্শিত দুটি পদ্ধতির মধ্যে পার্থক্য বুঝতে আগ্রহী ছিল।
drs

6
অনেক echoবাস্তবায়নের সমর্থন করি না -n(এবং আউটপুট would -n<SPC><NL>এখানে। printf '' > file.txtআরো (পোর্টেবল অন্তত আধুনিক / POSIX সিস্টেম জুড়ে হবে)।
Stéphane Chazelas
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.