ফাইল তৈরির জন্য কেন কোনও শেল কমান্ড নেই?


27

দৃষ্টি আকর্ষন করা:

কমান্ড লাইন থেকে কীভাবে ফাইল তৈরি করবেন তা আমি জিজ্ঞাসা করছি না !


আমি touchবছরের পর বছর ধরে ফাইল তৈরির জন্য ব্যবহার করে আসছি যে এটির প্রধান উদ্দেশ্য অন্যরকম। যদি কেউ কমান্ড লাইন থেকে একটি ফাইল তৈরি করতে চান তবে অনেকগুলি সম্ভাবনা রয়েছে:

touch foo.bar
> foo.bar
cat > foo.bar
echo -n > foo.bar
printf '' > foo.bar

এবং আমি নিশ্চিত আরও কিছু আছে।

তবে আসল বিষয়টি হ'ল উপরের কমান্ডগুলির কোনওটিই ফাইল তৈরির জন্য তৈরি করা হয়নি। উদাহরণস্বরূপ, man touchপ্রস্তাব দেয় এই আদেশটি ফাইল টাইমস্ট্যাম্পগুলি পরিবর্তন করার জন্য। ইউনিক্স (বা লিনাক্স) হিসাবে সম্পূর্ণ কোনও ওএসের সম্পূর্ণরূপে ফাইল তৈরির জন্য ডিজাইন করা কমান্ড নেই কেন?


35
ইতিমধ্যে বিদ্যমান সরঞ্জামের সাহায্যে এক ডজন উপায়ে করা যেতে পারে এমন একটি আদেশ করার জন্য আপনি কেন সিস্টেমটিকে বিশৃঙ্খলা করবেন?
মাইকেল কোহনে

4
স্ট্রিমগুলি / স্টিডিন / আউট থেকে ফাইল পড়ার জন্য কেন কোনও আদেশ নেই? প্রত্যেকেই কমান্ডের উদ্দেশ্যে তৈরি কমান্ডটি ব্যবহার করে cat!
এসএফ

2
@ মিশেলকোহনে, আমি আপনার বক্তব্যটি দেখতে পাচ্ছি, যথাযথ শ্রদ্ধার সাথে, আমার এতে সমস্যা আছে। এই পদ্ধতির সাথে অনেকগুলি কমান্ড রয়েছে যা কেবলমাত্র সিস্টেমকে বিশৃঙ্খল করে চলেছে। কেন moreযখন lessবেশি কিছু করে ব্যবহার moreকরবেন !? বা dirএবং ls। যাইহোক, আমি সামঞ্জস্যতা বিষয় সম্পর্কে সচেতন।
পৌয়া

9
moreসৃষ্টির পূর্বাভাস দেয় lesslessএর ত্রুটিগুলি সমাধান করার জন্য বিশেষভাবে তৈরি করা হয়েছে moremoreপশ্চাদপটে সামঞ্জস্যতার কারণে এখনও বিদ্যমান। dirএবং lsবেশিরভাগ উদ্দেশ্য এবং উদ্দেশ্যগুলির জন্য একই নির্বাহযোগ্য - এগুলি কেবল কয়েকটি মুষ্টি বাইটে পৃথক। একটি নতুন সরঞ্জাম ফাইল তৈরি করতে হবে জন্য বিশেষভাবে অভিপ্রেত কম বিদ্যমান সরঞ্জাম চেয়ে এবং যেমন এটি একটি রিগ্রেশন, না ক্ষেত্রে মত একটি উন্নতি হবে lessবনাম more
ল্যানজ

1
এছাড়াও আমাদের উত্তরাধিকারের দিকে নজর দেওয়া দরকার, প্রতিটি বাইট গণনা করার সময় ইউনিক্স তৈরি করা হয়েছিল। আপনি ইতিমধ্যে বিদ্যমান ইউটিলিটিটি করতে পারেন এমন কোনও কাজের জন্য কেন একটি ইউটিলিটি তৈরি করবেন?
থমাস

উত্তর:


38

আমি বলব কারণ একটি খালি ফাইল তৈরি করা খুব কমই দরকার যে আপনি কমান্ড লাইনে বা শেল স্ক্রিপ্টিংতে তত্ক্ষণে সামগ্রীটি পূরণ করতে পারবেন না।

আপনি যদি এক ধাপে এটি করতে পারেন তবে প্রথমে ফাইল তৈরি এবং তারপরে I / O পুনর্নির্দেশটি ব্যবহার করে কোনও ফাইলই লিখতে পারে না।

এই ক্ষেত্রে যেখানে আপনি সত্যিই একটি খালি ফাইল তৈরি করতে চান এবং এটি রেখে > "${file}"যেতে চান আমি যুক্তি দিয়েছি যা ব্রেফার এবং আরও মার্জিত হতে পারে না।

টিএল; ডিআর : এটি বিদ্যমান নেই কারণ খালি ফাইল তৈরির প্রায়শই কোনও ব্যবহার হয় না এবং ক্ষেত্রে এটি ইতিমধ্যে এই লক্ষ্য অর্জনের জন্য অগণিত বিকল্পের উপস্থিতি রয়েছে।

সাইড নোটে, touchকেবলমাত্র ফাইলের উপস্থিতি ব্যবহার করা যখন ফাইল বিদ্যমান না থাকে তবে পুনঃনির্দেশ ব্যবহারের বিকল্পগুলি সর্বদা ফাইলকে ছাঁটাই করে দেবে, এমনকি এটি উপস্থিত থাকলেও (তাই প্রযুক্তিগতভাবে, সমাধানগুলি অভিন্ন নয়)। > fooএটি একটি পছন্দসই পদ্ধতি যেহেতু এটি একটি সংরক্ষণ করে forkএবং echo -nসাধারণত এটি এড়ানো উচিত যেহেতু এটি অত্যন্ত অপ্রয়োজনীয়।


1
আমি ফাইলটি তৈরি এবং তারপরে খুব শক্ত আই / ও সরঞ্জামগুলি ব্যবহার করার বিষয়ে আপনার পয়েন্টটি পেয়েছি। ধন্যবাদ.
Pouya

1
@ ফাহিমমিঠা হ্যাঁ ( >>)। আমি ওপি ব্যবহার করে প্রদত্ত উদাহরণগুলি উল্লেখ করছি >। আপনার পরে যা আছে সেগুলি ফাইল তৈরি করা হলে (বা সেগুলি উপস্থিত থাকলে কোনও আউট পাওয়া যায় না) যুক্ত করা যথেষ্ট অযথা হবে।
অ্যাড্রিয়ান ফ্রহ্বর্থ

1
ভুলে যাবেন না যে না noclobber, যাতে সেট করতে করেননি করা >একটি বিদ্যমান ফাইল মুছে ফেলা হবে।
ওউকি

1
@ ওকি আফাইক, সেটিংস যেটি ডিফল্ট আচরণ নয় এবং এটি ভুলে যেতে পারে যে এটি একটি সিস্টেমে সেট করা হয়েছে এবং অন্যটি নয়, সম্ভাব্যভাবে একইভাবে সমস্যার দিকে পরিচালিত করছে যে এর alias rm='rm -i'পরিবর্তে একটি তৈরি alias rmi='rm -i'করা একটি খারাপ ধারণা।
আগি হামার্থিফ

1
@ মাইকসার্ভ, > .fileএকা কমান্ড লাইনে, এটি ছাড়াই পুরোপুরি ভাল করবে :
চার্লস ডাফি

16

অ্যাড্রিয়ান ফ্রেহার্থীর উত্তর ঠিক আছে। আমি শুধু যোগ করার জন্য আসলে একটি কমান্ড বিশেষভাবে ফাইল তৈরি করতে লিখিত আছে যে চেয়েছিলেন: mktemp

NAME
       mktemp - create a temporary file or directory

SYNOPSIS
       mktemp [OPTION]... [TEMPLATE]

DESCRIPTION
       Create a temporary file or directory, safely, and print its name.  TEM
       PLATE must contain at least 3 consecutive 'X's in last  component.   If
       TEMPLATE is not specified, use tmp.XXXXXXXXXX, and --tmpdir is implied.
       Files are created u+rw, and directories  u+rwx,  minus  umask  restric
       tions.

অনুমোদিত, mktempএর কাজ নির্দিষ্ট নাম দিয়ে কোনও ফাইল তৈরি করা নয়, কেবল ফাইল তৈরি করা । তবে, যেমন আপনাকে ইতিমধ্যে বলা হয়েছে, নির্দিষ্ট নাম দিয়ে ফাইলগুলি তৈরি করার আরও অনেক দক্ষ এবং মার্জিত উপায় রয়েছে যা এর জন্য একটি কমান্ড সরবরাহ করা অর্থহীন।

এটি বলেছিল, আপনারও রয়েছে truncateএবং fallocateউভয়ই যার প্রয়োজনীয় উদ্দেশ্য ফাইল তৈরি করা। তাদের সহজভাবে আরও পরিশীলিত পদ্ধতি রয়েছে। এর > fileচেয়ে ভাল কোনও উপায় না থাকায় এমন কোনও সহজ প্রোগ্রাম নেই যা কিছু করে > file


11

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

: >./file

এটি একটি খালি ফাইল তৈরি করে। অথবা কোনও বিদ্যমান ফাইলকে যেমন আপনি চান তেমন করে দেয়। আপনি পারেন:

set -o noclobber

পরবর্তী ঘটনাগুলির কোনও সম্ভাবনা এড়াতে আপনি যদি না:

: >|./file

আপনি এর touchসাথে একইরকম আচরণ পেতে পারেন :

: >>./file
: >>|./file

এটি বাদে :কোনও ফাইলের মোডটাইম আপডেট হবে না কারণ এটি সংশোধিত হয়নি।

ডেমো

mkdir test ; cd $_
touch touch.file 
: >null.file
echo >echo.file
ls -l

আউটপুট

-rw-r--r-- 1 mikeserv mikeserv 1 Apr 10 14:52 echo.file
-rw-r--r-- 1 mikeserv mikeserv 0 Apr 10 14:52 null.file
-rw-r--r-- 1 mikeserv mikeserv 0 Apr 10 14:52 touch.file

স্পর্শ না করা

: >>|./echo.file
ls -l 

আউটপুট

-rw-r--r-- 1 mikeserv mikeserv 1 Apr 10 14:52 echo.file
-rw-r--r-- 1 mikeserv mikeserv 0 Apr 10 14:52 null.file
-rw-r--r-- 1 mikeserv mikeserv 0 Apr 10 14:52 touch.file

ডিফল্টরূপে, প্রতিধ্বনি \nলাইনের শেষে যুক্ত হয়। চেষ্টা echo -n >echo-n.file(আকার = 0) এবং echo -e >echo-e.file(আকার = 1)
থমাস

@ থমাসের একটি স্ট্রিং স্ট্যান্ডার্ড আউটপুটে লেখা হবে। যদি প্রথম অপারেন্ডটি -n হয়, বা যদি কোনও অপারেন্ডে ব্যাকস্ল্যাশ ('\') অক্ষর থাকে তবে ফলাফলগুলি বাস্তবায়ন-সংজ্ঞায়িত হয়। এক্সএসআই-কনফর্মেন্ট সিস্টেমগুলিতে, যদি প্রথম অপারেন্ড -n হয় তবে এটি একটি স্ট্রিং হিসাবে বিবেচিত হবে, বিকল্প হিসাবে নয়। নিম্নলিখিত চরিত্র সিকোয়েন্স আর্গুমেন্ট কোন মধ্যে XSI-conformant সিস্টেমে স্বীকৃত হইবে ... ' pubs.opengroup.org/onlinepubs/009604599/utilities/echo.html
mikeserv

পর্যাপ্ত পরিমাণে, লিঙ্কটির জন্য ধন্যবাদ, এবং আমার মন্তব্যটি যাইহোক বিন্দু নয়
টমাস

2
হ্যাঁ সত্যই এবং দুঃখিত, আমি বোঝাতে চাইছিলাম যে আমার মন্তব্যে যাইহোক আপনার উত্তরটির বিন্দুটি অনুপস্থিত ছিল, সে সম্পর্কে দুঃখিত।
টমাস

1
সাধারণকরণের জন্য ইউনিক্সের প্রবণতার একটি উদাহরণ হ'ল কোনও ফাইলের বিষয়বস্তু প্রদর্শন করার কমান্ডটি বলা হয় cat। কেন কোনও ফাইলকে প্রদর্শন করার জন্য একটি আদেশ রয়েছে, যখন আপনি একাধিক ফাইলকে স্ট্যান্ডার্ড আউটপুটে সংযুক্ত করতে পারেন?
200_সাক্সেস

1

ইউটিলিটি installআসলে ফাইল তৈরির জন্য ডিজাইন করা হয়েছে! আপনি ফাইলটির বিষয়বস্তুগুলির মাধ্যমে পাস করতে পারেন /dev/stdin(বেশিরভাগ ক্ষেত্রে, তবে লিনাক্সের বেশিরভাগ স্বাদে এটির প্রয়োজন /procহয়) বা অন্য উত্স ফাইল সরবরাহ করতে পারেন। আপনি মালিকানা এবং অনুমতি সেট করতে পারেন।

echo "New file" | install -o 0644 -m 452452 -g dumbass /dev/stdin /var/www/index.html

একটি নির্বোধ উদাহরণ হিসাবে।

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