शेल - एक फ़ाइल के लिए चर सामग्री लिखें


95

मैं एक चर की सामग्री (यहां कहा जाता है var) को एक फ़ाइल में कॉपी करना चाहूंगा ।

फ़ाइल का नाम किसी अन्य चर में संग्रहीत है destfile

मुझे ऐसा करने में समस्या हो रही है। यहाँ मैंने कोशिश की है:

cp $var $destfile

मैंने dd कमांड के साथ भी यही कोशिश की है ... जाहिर तौर पर शेल ने सोचा था कि $varएक डायरेक्टरी की बात हो रही थी और इसलिए मुझे बताया गया कि डायरेक्टरी नहीं मिली।

मैं इसके आसपास कैसे पहुंचू?


2
कृपया कुछ ठीक से फ़ॉर्मेट किए गए कोड को पोस्ट करके अपने प्रश्न को बेहतर बनाएं, जो दिखाता है कि आप अपने चर को कैसे पॉप्युलेट कर रहे हैं, और सभी प्रासंगिक त्रुटि संदेश ठीक वैसे ही जैसे वे दिखाई देते हैं।
टॉड ए। जैकब्स

2
एक निर्देशिका में "एक चर की सामग्री की नकल" से आपका क्या मतलब है? $varएक फ़ाइल नाम या कुछ पाठ निर्दिष्ट करता है जिसे फ़ाइल में लिखा जाना चाहिए? यदि यह पाठ निर्दिष्ट करता है, तो उस फ़ाइल का नाम क्या है जिसे आप इस सामग्री को लिखना चाहते हैं?
जहारॉय

$ var में वह पाठ होता है जिसे मैं कॉपी करना चाहता हूं और जिस फाइल को लिखा जाना चाहिए, वह उपयोगकर्ता द्वारा परिभाषित किया गया है, इसलिए इसका कारण यह है कि मैं पहली बार एक चर का उपयोग कर रहा हूं।
user1546083

1
शायद $destdirनाम होना चाहिए $destfileइसलिए यह भ्रामक नहीं है ... नाम से $destdirपता चलता है कि यह एक फ़ाइल के बजाय एक निर्देशिका निर्दिष्ट करता है। इससे आपका पूरा सवाल सीधा और समझने में आसान होगा।
जहारॉय

जवाबों:


145

echoकमांड का उपयोग करें :

var="text to append";
destdir=/some/directory/path/filename

if [ -f "$destdir" ]
then 
    echo "$var" > "$destdir"
fi

ifपरीक्षण है कि $destdirएक फ़ाइल का प्रतिनिधित्व करता है।

>फ़ाइल को छोटा करने के बाद पाठ जोड़ देता है। यदि आप केवल पाठ को $varमौजूदा सामग्री में फ़ाइल में जोड़ना चाहते हैं, तो >>इसके बजाय उपयोग करें :

echo "$var" >> "$destdir"

cpआदेश किसी फ़ाइल में पाठ लिखने के लिए नहीं (फ़ाइलों के लिए) फाइलों को कॉपी करने के लिए प्रयोग किया जाता है,।


4
अधिक उद्धरण की आवश्यकता है - अभी, चर के मान के भीतर व्हॉट्सएप के किसी भी रन को एक एकल स्थान में बदल दिया जाएगा, ग्लोब अभिव्यक्ति का विस्तार किया जाएगा, आदि
चार्ल्स डफी

2
एक और बात - आपको समापन उद्धरण और अंदर के बीच एक स्थान की आवश्यकता ]है "$destdir"]
चार्ल्स डफी

3
echoअपने वैरिएबल में एक अनुगामी न्यूलाइन भी जोड़ता है।
बेन दिल्ट्स

6
यह अगर विफल रहता $varहै -e text to append, और शामिल नहीं है वास्तव में लिखने-e
एरिक

1
क्योंकि echo $varआपके चर का विस्तार करने के लिए शेल पर निर्भर है, यह सफेद अंतरिक्ष और विशेष वर्ण जैसी चीजों के साथ बहुत काम नहीं करेगा। आप perl -e 'print($ENV{var})'इसके बजाय उपयोग कर सकते हैं , और यह चर के मूल्य को ठीक से आउटपुट करेगा।
ब्लेक मिशेल

38

echoसमस्या है कि अगर varकुछ की तरह है -e, यह एक ध्वज के रूप में व्याख्या की जाएगी। एक अन्य विकल्प है printf, लेकिन printf "$var" > "$destdir"चर में किसी भी भागे हुए वर्णों का विस्तार करेगा, इसलिए यदि चर में बैकस्लैश शामिल हैं तो फ़ाइल सामग्री मेल नहीं खाएगी। हालाँकि, क्योंकि printfप्रारूप स्ट्रिंग में केवल बैकस्लैश की व्याख्या की जाती है, आप %sगंतव्य फ़ाइल में सटीक चर सामग्री को संग्रहीत करने के लिए प्रारूप विनिर्देशक का उपयोग कर सकते हैं :

printf "%s" "$var" > "$destdir"


1
प्रिंटफ़ भी अच्छा है यदि आपके पास वैरिएबल स्ट्रिंग में नए अंक हैं, जैसे कि ट्रिपल उद्धरण या हेरेडोक से। इको न्यूलाइन्स को अच्छी तरह से हैंडल नहीं करता है।
बीफ्लोबिल

@beeflobill आप बता सकते हैं कि "इको न्यूलाइन्स को अच्छी तरह से कैसे हैंडल नहीं करता है"। केवल एक चीज मैंने देखी है कि इको एक नई पंक्ति जोड़ता है। जो echo "$var" > destfileगलत करता है।
सेंसॉरस्मिथ

@SensorSmith मेरे प्रयोगों में, मैं देखता हूं कि जब स्ट्रिंग में \ n "" होता है, तो प्रतिध्वनि एक नए वर्ण को मुद्रित करेगी। लेकिन, अगर स्ट्रिंग में एक वास्तविक न्यूलाइन वर्ण है, जो प्रतिध्वनि नहीं छपेगा। मुझे पता नहीं क्यों।
बीफ्लोबिल

1
मूल रूप से एक पोर्टेबिलिटी (और विश्वसनीयता) मुद्दा है। unix.stackexchange.com/a/65819… या हमारे बीच घातक के लिए: printfबेहतर है, आगे बढ़ें।
user3342816

29

यदि आपके वैरिएबल में से कोई भी उत्तर काम नहीं करता है:

  • इसके साथ आरंभ होता है -e
  • इसके साथ आरंभ होता है -n
  • इसके साथ आरंभ होता है -E
  • एक के \बाद एक शामिल हैn
  • इसके बाद एक अतिरिक्त newline संलग्न नहीं होना चाहिए

और इसलिए उन्हें मनमानी स्ट्रिंग सामग्री के लिए भरोसा नहीं किया जा सकता है।

बैश में, आप "यहां स्ट्रिंग्स" का उपयोग कर सकते हैं:

cat <<< "$var" > "$destdir"

जैसा कि नीचे टिप्पणी में उल्लेख किया गया है, @ ट्रेबावा का जवाब (मेरा जैसा कमरा है!) का उपयोग printfकरना बेहतर दृष्टिकोण है।


5
मैं जो बता सकता हूं, उससे बिल्ली हमेशा फ़ाइल के अंत में एक नई पंक्ति सम्मिलित करेगी, भले ही चर के अंत में एक नई रेखा न हो (हालांकि ज्यादातर मामलों में यह अच्छी बात है)। प्रिंटफ का उपयोग करने वाला उत्तर एक अनुगामी न्यूलाइन डालने से बचता है।
ऐश

@Ash का एक और लाभ printfसे अधिक catहै कि पूर्व एक खोल निर्मित जो हमेशा एक बाहरी बाइनरी तुलना में तेजी से निष्पादित करेंगे है।
गाजा टॉरक

7

अगर मैंने आपको सही समझा, तो आप $varएक फ़ाइल में कॉपी करना चाहते हैं (यदि यह एक स्ट्रिंग है)।

echo $var > $destdir

यह कैसे किया जाता है। cpकमांड का उपयोग करके शेल को फ़ाइल या निर्देशिका के नाम के रूप में पहले तर्क की व्याख्या करेगा।
जहारॉय

5
यदि आप $varउद्धरणों में संलग्न नहीं हैं , तो फ़ाइल की सामग्री कुछ मामलों में $ var की सामग्री के साथ 100% बराबर नहीं है। उदाहरण के लिए जब "गूंज" संस्करण जिसमें RSA कुंजियाँ होती हैं, तो आपको फ़ाइल में अमान्य कुंजी मिलती है।
श्रीगी

6
यदि $varरिक्त स्थान शामिल हैं या-e
एरिक

1

जब आप कहते हैं "किसी चर की सामग्री की प्रतिलिपि बनाएँ", तो क्या उस चर में एक फ़ाइल नाम होता है, या उसमें एक फ़ाइल का नाम होता है?

मैं आपके प्रश्न पर विचार कर रहा हूं $varजिसमें वह सामग्री है जिसे आप फ़ाइल में कॉपी करना चाहते हैं:

$ echo "$var" > "$destdir"

यह एक फाइल में $ var के मूल्य को प्रतिध्वनित करेगा जिसे $ डेस्टिर कहा जाता है। उद्धरणों पर ध्यान दें। उद्धरण में संलग्न "$ var" होना बहुत महत्वपूर्ण है। "$ डेस्टिर" के लिए भी अगर नाम में जगह है। इसे संलग्न करने के लिए:

$ echo "$var" >> "$destdir"

3
अगर varइसमें विफल रहता है-e
एरिक

1
echo अपनी विकल्प सूची को समाप्त करने के लिए पहले तर्क के रूप में एक डबल हाइफ़न पास करना , इस प्रकार @Eric द्वारा उठाए गए मुद्दे को हल करता है:echo -- "$var" >> "$destfile"
Géza Török

1

उपरोक्त सभी काम करते हैं, लेकिन एक समस्या (एस्केप और विशेष वर्ण) के आसपास काम करना पड़ता है जो पहली जगह में होने की आवश्यकता नहीं है: विशेष वर्ण जब चर शेल द्वारा विस्तारित होता है। बस (चर विस्तार) पहली जगह में नहीं है। विस्तार के बिना, सीधे चर का उपयोग करें।

इसके अलावा, यदि आपके चर में कोई रहस्य है और आप उस रहस्य को एक फ़ाइल में कॉपी करना चाहते हैं, तो आप कमांड लाइन में विस्तार नहीं करना चाहते हैं क्योंकि शेल कमांड्स की ट्रेसिंग / कमांड गूंज गुप्त को प्रकट कर सकती है। इसका मतलब है, सभी उत्तर जो $varकमांड लाइन में उपयोग करते हैं, शेल के ट्रेसिंग और लॉगिंग के लिए चर सामग्री को उजागर करके एक संभावित सुरक्षा जोखिम हो सकता है।

इसे इस्तेमाल करो:

printenv var >file

इसका मतलब है, ओपी प्रश्न के मामले में:

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