2011-12-07 17 views
33

मैं इस स्क्रिप्ट में लिखा है:"~/डेस्कटॉप/test.txt: ऐसी कोई फ़ाइल या निर्देशिका"

#!/bin/bash 

file="~/Desktop/test.txt" 
echo "TESTING" > $file 

स्क्रिप्ट काम नहीं करता है; यह मुझे यह त्रुटि देता है:

./tester.sh: line 4: ~/Desktop/test.txt: No such file or directory 

मैं क्या गलत कर रहा हूं?

+0

मैंने शीर्षक को और अधिक वर्णनात्मक बनाने के लिए बदल दिया। –

+0

[संभवतः बैश में काम नहीं कर रहे टिल्ड विस्तार का संभावित डुप्लिकेट] (https://stackoverflow.com/questions/5748216/tilde-expansion-not-working-in-bash) – codeforester

उत्तर

53

$HOME साथ ~ के बजाय ऐसे। टिल्डे का विस्तार केवल तब होता है जब टिल्ड अनजान होता है। info "(bash) Tilde Expansion" देखें।

आप इसे उद्धृत किए बिना file=~/Desktop भी कर सकते हैं, लेकिन यदि आप कभी इसके क्षेत्र में विभाजक के साथ कुछ के साथ इसका हिस्सा बदलते हैं, तो यह टूट जाएगा। चर के मूल्यों को उद्धृत करना वैसे भी आदत में आने के लिए एक अच्छी बात है। क्वोटिंग चर file=~/"Desktop" भी काम करेगा लेकिन मुझे लगता है कि यह बदसूरत है।

$HOME पसंद करते हैं करने के लिए एक और कारण है, जब संभव: टिल्ड विस्तार केवल शब्दों की शुरुआत में क्या होता है। तो command --option=~/foo केवल तभी काम करेगा यदि command tilde विस्तार स्वयं करता है, जो कमांड द्वारा भिन्न होगा, जबकि command --option="$HOME/foo" हमेशा काम करेगा।

+0

वाह, यह काम करता है! यह कैसे काम करता है और मेरी लिपि नहीं थी? – Mason

+1

अद्यतन उत्तर। –

+4

@ मेसन - भी, tilde विस्तार _before_ परिवर्तनीय विस्तार होता है, इसलिए जब '$ file' को' ~/डेस्कटॉप/test.txt' में परिवर्तित किया जाता है, तो आप पहले से ही टिल्डे विस्तार चरण को याद कर चुके हैं। विस्तार के क्रम के लिए http://www.gnu.org/software/bash/manual/bashref.html#Shell- एक्सपेंशन देखें। –

1

FYI करें, आप भी eval उपयोग कर सकते हैं:

eval "echo "TESTING" > $file" 

eval एक तर्क के रूप आदेश लेता है और यह खोल Tilde expansion करने के लिए कारण बनता है।

संबंधित मुद्दे