अगर बैश में होम कैरेक्टर (~) का उपयोग करके निर्देशिका मौजूद है, तो जांचें


16

bashयदि कोई निर्देशिका विफल हो जाती है तो निम्न जाँच क्यों होती है ?

if [ ! -d "~/Desktop" ]; then
   echo "DOES NOT EXIST"
   exit 1;
fi

~/Desktopवास्तव में मौजूद है। इस तरह से एक मैक पर है।


समस्या इस प्रकार की स्क्रिप्ट के साथ है

read -p "Provide the destination directory: " DESTINATION

if [ ! -d $DESTINATION ]; then
    echo "\t'$DESTINATION' does not exist." >&2;
    exit 1;
fi

1
जैसे जब आप करते हैं cd "~/Desktop"आपको एक त्रुटि भी मिलती है। इसे अयोग्य या एक चर के रूप में संग्रहीत किया जाना है (उद्धरण के बिना)। उदाहरण के लिए, a=~/Desktop; cd $a;काम करता है, लेकिन नहीं a="~/Desktop"; cd Desktop;देखें serverfault.com/questions/417252/...
dylnmc

जवाबों:


7

जस्टिन ने क्वांटा के जवाब पर अपनी पहली टिप्पणी में अपना प्रश्न स्पष्ट किया। वह पाठ की एक पंक्ति में पढ़ रहा है read(या किसी अन्य गतिशील माध्यम से) और टिल्ड का विस्तार करना चाहता है।

सवाल यह है कि "आप एक चर की सामग्री पर टिल्ड विस्तार कैसे करते हैं?"

सामान्य दृष्टिकोण का उपयोग करना है eval, लेकिन यह >चर में कुछ महत्वपूर्ण कैविटीज़, अर्थात् रिक्त स्थान और आउटपुट पुनर्निर्देशन ( ) के साथ आता है । निम्नलिखित मेरे लिए काम करता है:

read -p "Provide the destination directory: " DESTINATION

if [ ! -d "`eval echo ${DESTINATION//>}`" ]; then
    echo "'$DESTINATION' does not exist." >&2;
    exit 1;
fi

निम्नलिखित प्रत्येक इनपुट के साथ इसे आज़माएँ:

~
~/existing_dir
~/existing dir with spaces
~/nonexistant_dir
~/nonexistant dir with spaces
~/string containing > redirection
~/string containing > redirection > again and >> again

व्याख्या

  • ${mypath//>}बाहर स्ट्रिप्स >पात्रों जिसके दौरान एक फ़ाइल मार सकता है eval
  • eval echo ...क्या वास्तविक टिल्ड विस्तार करता है
  • डबल-कोट्स evalरिक्त स्थान के साथ फ़ाइल नाम के समर्थन के लिए हैं।

इसके पूरक के रूप में, आप -eपढ़ने के विकल्प को जोड़कर UX में सुधार कर सकते हैं:

read -p "Provide the destination directory: " -e DESTINATION

अब जब उपयोगकर्ता टिल्ड और हिट टैब में टाइप करता है, तो उसका विस्तार होगा। यह दृष्टिकोण उपर्युक्त दृष्टिकोण को प्रतिस्थापित नहीं करता है , हालांकि, जैसा कि विस्तार केवल तब होता है जब उपयोगकर्ता टैब हिट करता है। यदि वह सिर्फ ~ / फू और हिट में टाइप करता है, तो यह एक टिल्ड के रूप में रहेगा।

यह सभी देखें:


23

यह देखने के लिए कि क्या यह काम करता है, निर्देशिका के आसपास के दोहरे उद्धरणों को हटा दें:

if [ ! -d ~/Desktop ]; then
   echo "DOES NOT EXIST"
   exit 1;
fi

इसका कारण है टिल्ड का विस्तार केवल तब ही काम करता है जब यह अनक्वॉटेड हो।

info "(bash) Tilde Expansion"

3.5.2 Tilde Expansion
---------------------

If a word begins with an unquoted tilde character (`~'), all of the
characters up to the first unquoted slash (or all characters, if there
is no unquoted slash) are considered a TILDE-PREFIX.  If none of the
characters in the tilde-prefix are quoted, the characters in the
tilde-prefix following the tilde are treated as a possible LOGIN NAME.
If this login name is the null string, the tilde is replaced with the
value of the `HOME' shell variable.  If `HOME' is unset, the home
directory of the user executing the shell is substituted instead.
Otherwise, the tilde-prefix is replaced with the home directory
associated with the specified login name.

कैसे के बारे में अगर मूल्य गतिशील रूप से आता है। यानी ( pastie.org/4471350 ) और DESTINATIONहै ~/Desktop
जस्टिन

3
चर का विस्तार तब किया जाता है जब चर का निर्धारण किया जाता है, न कि जब इसका मूल्यांकन किया जाता है, तो यह एक उचित उदाहरण नहीं है।
MadHatter

+1, यह मेरी समस्या को हल करने के लिए पर्याप्त है।
फ्लाइंग फिशर

4

यह केवल मैक पर ही नहीं बल्कि किसी भी प्लेटफ़ॉर्म पर काम करता है जो बैश पर चलता है।

जब आप "~ / डेस्कटॉप" उद्धृत करते हैं, तो आप ~ फ़ोल्डर के अंदर डेस्कटॉप की तलाश के लिए बैश बता रहे हैं। उद्धरण ~ के विशेष उद्देश्य को हटा देता है

देखें - http://www.gnu.org/software/bash/manual/bashref.html#Tilde-Expansion

दोहरे उद्धरण चिह्नों को हटा दें और यह काम करना चाहिए।


1

Daud

echo $HOME

उपयोग करें $HOME, और सुनिश्चित करें कि उपयोगकर्ता वास्तव में स्क्रिप्ट का उपयोग कर रहा है। अगर जड़ ~अपने उपयोग को देखने के लिए जा रहा है /root, तो नहीं /home/$USER

if [ ! -d "$HOME/Desktop" ]; then
   echo "DOES NOT EXIST"
   exit 1;
fi

-1
if [ ! -d "$HOME/Desktop" ]; then
   echo "DOES NOT EXIST"
   exit 1;
fi

~ के बजाय $ HOME होना चाहिए

~ एक KEYBOARD बात है


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