यहाँ दस्तावेज़ में "$" कैसे प्रिंट करें


42

मैं यहां "$" को बैश में डॉक कैसे कर सकता हूं?

उदाहरण के लिए, मैं दूरस्थ सर्वर पर सामग्री जैसी फ़ाइल रखना चाहता हूं $ABC=home_dir

$ ssh hostname sudo -s <<EOF
echo "$ABC=home_dir" > file
EOF

लेकिन इसे एक चर के रूप में माना जाएगा। मैं शाब्दिक कैसे प्रिंट कर सकता हूं $?


2
आप एकल उद्धरणों का उपयोग कर सकते हैं
राहुल पाटिल

2
यह काफी हद तक अप्रत्यक्ष है। क्या आप वाकई स्थानीय होस्ट पर फ़ाइल नहीं बना सकते हैं और फिर scpयह सुनिश्चित करें?
l0b0

जवाबों:


65

यदि आप यहाँ एक डॉक लिखना चाहते हैं और आप नहीं चाहते हैं कि डॉक का कोई भी विस्तार किया जाए या किसी विशेष वर्ण की व्याख्या की जाए, तो आप इस तरह एकल उद्धरण के साथ लेबल को उद्धृत कर सकते हैं:

$ cat >file <<'EOF'
echo "$ABC=home_dir"
EOF

हालाँकि, आपके उदाहरण में वर्णित आपकी स्थिति बहुत अधिक जटिल है, क्योंकि आप वास्तव में इस सामग्री को ssh के माध्यम से, एक दूरस्थ सिस्टम में, sudo द्वारा चलाया जा रहा है, जो एक शेल को भी आमंत्रित कर रहा है (और इसलिए कि शेल सामग्री का विस्तार करेगा भी)। आपको इस अधिकार को प्राप्त करने के लिए अधिक स्तरों की आवश्यकता है, लेकिन इसके साथ भी यह अभी भी काम नहीं करेगा क्योंकि सूडो को एक टर्मिनल की आवश्यकता होती है (इसलिए यह पासवर्ड मांग सकता है) और आपने स्टड से पुनर्निर्देशित किया है। यहां तक ​​कि उपयोग करने ssh -tसे भी यहाँ मदद नहीं मिलेगी।

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


यह सबसे अच्छा जवाब है क्योंकि यह बहुत लंबे एचआरई दस्तावेजों के लिए पूरा कर सकता है। यह (ज्यादातर) बेवकूफ-सबूत है।
फेलिप अल्वारेज़

22

बच जाते हैं $

$ ssh hostname sudo -s <<EOF
echo "\$ABC=home_dir" > file
EOF

मुझे नहीं पता कि आपका उपयोग मामला क्या है, लेकिन आमतौर पर आप home_dir=$ABCइसके बजाय चाहते हैं $ABC=home_dir


2
यह समाधान काम करेगा, लेकिन क्या यह ओपी चाहता है? यह एक शेल स्क्रिप्ट उत्पन्न करने के लिए प्रतीत होता है जो निष्पादित होने पर "फ़ाइल" में एक स्ट्रिंग संग्रहीत करेगा जो कि एबीसी के बाईं ओर के लिए डीरेंसेंस करेगा और =home_dirफ़ाइल में स्टोर करने की संभावना है ? बेशक मुझे नहीं पता कि उपयोग का मामला क्या है ...
जोहान

2
यह एक शाब्दिक $को दूरस्थ शेल में भेजने का कारण होगा , लेकिन तब स्ट्रिंग को गूंजने से पहले उस शेल का विस्तार होगा । फ़ाइल को शाब्दिक लिखने के लिए, आपको एक और (बच) बैकस्लैश की आवश्यकता होगी: ताकि दूरस्थ शेल प्राप्त हो । $ABCfile$echo "\\\$ABC=home_dir"echo "\$ABC=home_dir"
शेपनर


4

आप catदूरस्थ अंत पर एक प्रक्रिया को स्ट्रिंग भेजकर अपने आप को स्तर को बचाने के लिए बचाते हैं :

echo 'echo $ABC=home_dir' | ssh hostname sudo -s "cat > file"

एकल उद्धरण $स्थानीय छोर पर सुरक्षा करते हैं , और स्ट्रिंग को कभी भी शेल द्वारा दूसरे पर नहीं देखा जाता है क्योंकि यह किसी अन्य शेल कमांड के लिए तर्क के बजाय सीधे cat(माध्यम से sudo) पढ़ा जाता है ।

अपने कोड के साथ, आपको सुरक्षा के लिए भागने की एक अतिरिक्त परत की आवश्यकता होगी $:

$ ssh hostname sudo -s <<EOF
echo "\\\$ABC=home_dir" > file
EOF

आपको \$दूरस्थ होस्ट को एक शाब्दिक भेजने की आवश्यकता है , ताकि दूरस्थ शेल $फ़ाइल में एक शाब्दिक लिख देगा । आप यहां-डॉके मार्कर के हवाले से इसे सरल बना सकते हैं:

$ ssh hostname sudo -s <<\EOF
echo "\$ABC=home_dir" > file
EOF
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.