फ़ाइलें बनाने के लिए कोई शेल कमांड क्यों नहीं है?


27

कृपया ध्यान दें:

मैं यह नहीं पूछ रहा हूं कि कमांड लाइन से फाइल कैसे बनाई जाए!


मैं इस बात पर touchध्यान दिए बिना वर्षों से फाइलें बनाने के लिए उपयोग कर रहा हूं कि इसका मुख्य उद्देश्य कुछ और है। यदि कोई कमांड लाइन से एक फ़ाइल बनाना चाहता है तो बहुत सारी संभावनाएँ हैं:

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

और मुझे यकीन है कि वहाँ और भी हैं।

लेकिन तथ्य यह है कि ऊपर दिए गए आदेशों में से कोई भी वास्तव में फाइल बनाने के लिए डिज़ाइन नहीं किया गया है। उदाहरण के लिए, man touchपता चलता है कि यह कमांड फ़ाइल टाइमस्टैम्प बदलने के लिए है। यूनिक्स (या लिनक्स) के रूप में एक ओएस पूरा क्यों नहीं होता है, केवल फाइलों को बनाने के लिए एक कमांड पूरी तरह से डिज़ाइन किया गया है?


35
आप कुछ करने के लिए कमांड जोड़ने के लिए सिस्टम को अव्यवस्थित क्यों करेंगे जो पहले से मौजूद उपकरणों के साथ एक दर्जन तरीके से किया जा सकता है?
माइकल कोहेन

4
/ से धाराओं / स्टडिन / आउट की फाइलों को पढ़ने के लिए कोई कमांड क्यों नहीं है? हर कोई con catenation के लिए इच्छित कमांड का उपयोग करता है !
एसएफ।

2
@MichaelKohne, मैं आपकी बात देखता हूं, पूरे सम्मान के साथ, मुझे इससे समस्या है। इस दृष्टिकोण के साथ कई कमांड हैं जो केवल सिस्टम को अव्यवस्थित कर रहे हैं। क्यों क्या करते हैं moreजब lessसे अधिक का उपयोग moreकरें !? या dirऔर ls। यद्यपि, मैं संगतता मुद्दों से अवगत हूं।
पूय

9
moreके निर्माण से पहले lesslessकी कमियों को दूर करने के लिए विशेष रूप से बनाया गया है moremoreअभी भी पिछड़े संगतता कारणों के लिए मौजूद है। dirऔर ls, ज्यादातर इरादों और उद्देश्यों के लिए, एक ही निष्पादन योग्य - वे केवल मुट्ठी भर बाइट्स में भिन्न होते हैं। फ़ाइलों को बनाने के लिए विशेष रूप से इरादा एक नया उपकरण मौजूदा उपकरणों से कम करेगा , और जैसे कि यह एक प्रतिगमन होगा, lessबनाम के मामले में सुधार नहीं more
lanzz

1
इसके अलावा हमें विरासत को देखने की जरूरत है, यूनिक्स तब बनाया गया था जब प्रत्येक बाइट को गिना गया था। एक कार्य के लिए एक उपयोगिता क्यों बनाएं जो आप पहले से मौजूद उपयोगिता के साथ कर सकते हैं?
थॉमस

जवाबों:


38

मैं कहूंगा क्योंकि खाली फाइल बनाने के लिए यह शायद ही कभी जरूरी है कि आप कमांड लाइन पर या शेल स्क्रिप्टिंग में तुरंत सामग्री न भरें।

पहले फ़ाइल बनाने में कोई फ़ायदा नहीं है और फिर I / O रीडायरेक्शन का उपयोग करके फ़ाइल को लिखना है यदि आप एक चरण में ऐसा कर सकते हैं।

उन मामलों में जहां आप वास्तव में एक खाली फ़ाइल बनाना चाहते हैं और इसे छोड़ना चाहते हैं, मैं तर्क देता हूं कि > "${file}"यह अधिक सुरक्षित और सुरुचिपूर्ण नहीं हो सकता है।

टीएल; डीआर : यह मौजूद नहीं है क्योंकि खाली फाइलों को बनाने का सबसे अधिक उपयोग होता है, और ऐसे मामलों में इस लक्ष्य को प्राप्त करने के लिए पहले से ही उपलब्ध विकल्पों में से एक असंख्य हैं।

एक साइड नोट पर, touchकेवल तभी काम करता है यदि फ़ाइल मौजूद नहीं है, जबकि पुनर्निर्देशन का उपयोग करने वाले विकल्प हमेशा फ़ाइल को काट देंगे, भले ही यह मौजूद हो (इसलिए तकनीकी रूप से, वे समाधान समान नहीं हैं)। > fooयह पसंदीदा तरीका है क्योंकि यह एक बचत करता है forkऔर echo -nइसे अत्यधिक असुरक्षित होने के बाद सामान्य रूप से बचा जाना चाहिए।


1
मुझे फ़ाइल बनाने और फिर I / O टूल का उपयोग करने के बारे में आपकी बात बहुत ठोस लगी। धन्यवाद।
पूय

1
@ फहीममिथ हां ( >>)। मैं ओपी द्वारा दिए गए उदाहरणों का उपयोग कर रहा था >। यदि आप जो हैं उसके बाद फ़ाइलें बनाना (या अगर वे मौजूद हैं तो NOOP बाहर) लागू करना काफी बेकार होगा।
एड्रियन फ्रुविर्थ

1
यह मत भूलो कि noclobberसेट नहीं करना है ताकि >मौजूदा फाइल को अधिलेखित कर दिया जाए ।
ओकु

1
@Ouki AFAIK, यह निर्धारित करना कि डिफ़ॉल्ट व्यवहार नहीं है और कोई यह भूल सकता है कि यह एक सिस्टम पर सेट है और दूसरा नहीं, संभवतः उसी तरह से परेशानी के लिए अग्रणी है जो alias rm='rm -i'इसके बजाय alias rmi='rm -i'एक बुरा विचार है।
एगी हैमर्थीफ़

1
@ mikeserv, > .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

जो एक खाली फाइल बनाता है। या आप के रूप में एक मौजूदा फ़ाइल truncates। आप ऐसा कर सकते हैं:

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 है, या यदि किसी भी ऑपरेंड में बैकस्लैश ('\') वर्ण है, तो परिणाम कार्यान्वयन-परिभाषित होते हैं। XSI- अनुरूप प्रणाली पर, यदि पहला ऑपरेंड -n है, तो इसे एक विकल्प के रूप में एक स्ट्रिंग के रूप में माना जाएगा। निम्नलिखित वर्ण अनुक्रमों को XSI-
mikeserv

काफी हद तक, लिंक के लिए धन्यवाद, और मेरी टिप्पणी वैसे भी बात नहीं है
थॉमस

2
हां, वास्तव में और क्षमा करें, मेरा मतलब था कि मेरी टिप्पणी को आपके उत्तर की बात याद आ रही थी, इसके बारे में खेद है।
थॉमस

1
सामान्यीकरण करने के लिए यूनिक्स की प्रवृत्ति का एक उदाहरण यह तथ्य है कि किसी फ़ाइल की सामग्री को प्रदर्शित करने के लिए कमांड को कहा जाता है cat। आपके पास एक फ़ाइल प्रदर्शित करने के लिए एक कमांड क्यों है, जब आप कई फाइलों को मानक आउटपुट में बदलने के लिए एक कमांड बना सकते हैं?
२००:०२ से २०

1

उपयोगिता installवास्तव में फाइलें बनाने के लिए डिज़ाइन की गई है! आप फ़ाइल की सामग्री को /dev/stdin(ज्यादातर मामलों में, हालांकि, लिनक्स के अधिकांश स्वादों पर, इसके लिए आवश्यक है कि /procमाउंट किया गया है) पास कर सकते हैं या दूसरी स्रोत फ़ाइल प्रदान कर सकते हैं। आप स्वामित्व और अनुमतियां सेट कर सकते हैं।

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

एक मूर्खतापूर्ण उदाहरण के रूप में।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.