2012-09-14 12 views

उत्तर

13

जब आप . file चलाते हैं, तो आप . बनाया गया खोल खोलते हैं। आपका xargs संस्करण वर्तमान निर्देशिका को निष्पादित करने का प्रयास करता है।
भले ही उसने बिल्टिन का आह्वान किया हो, वह आदेश एक सबहेल में चलता है, इसलिए सभी "सोर्सिंग" बेकार होगा।

उपयोग खोल ग्लोबिंग और उस के लिए एक पाश:

for file in * ; do 
    if [ -f "$file" ] ; then 
    . "$file" 
    fi 
done 
+0

स्वच्छ समाधान; यह जानना अच्छा है कि आप उस मामले के लिए 'xargs' (और 'find''s' -exec' प्राथमिक 'के साथ बिल्टिन का उपयोग नहीं कर सकते हैं। यहां समकक्ष एक-लाइनर है: 'f में * के लिए; करो [[-एफ "$ एफ"]] &&। "$ च"; किया गया – mklement0

1

@ चटाई के समाधान साफ ​​है, लेकिन मामले में आप इसे मजाक, निम्नलिखित समाधान के लिए कुछ बैश फू में रुचि रखते हैं , मूल find आदेश के आधार पर, काम करता है, भी:

eval $(find . -maxdepth 1 -type f -exec echo . \'{}\'';' \;) 
  • find एक सौ के निर्माण के लिए -exec साथ प्रयोग किया जाता है प्रत्येक फ़ाइल के लिए rcing कमांड मिला, उदा। . './foo';। विशेष वर्णों के साथ फ़ाइल नाम सुनिश्चित करने के लिए बच निकले एकल उद्धरणों पर ध्यान दें। ठीक से संभाला जाता है।
  • find सोर्सिंग कमांड की एक नई-अलग-अलग सूची लौटाएगा; कमांड प्रतिस्थापन ($()) बिना डबल-कोटिंग का उपयोग करके, खोल अलग-अलग के रूप में प्रत्येक स्थान का उपयोग करके इन पंक्तियों को एक पंक्ति में जोड़ता है।
  • अंत में, eval वर्तमान खोल (ओएस एक्स 10.8.1 पर सत्यापित) के संदर्भ में सोर्सिंग कमांड की पूरी सूची निष्पादित करता है।

नोट: इस समाधान के साथ एक संभावित समस्या यह है कि कमांड स्ट्रिंग बड़ी हो सकती है - संभवतः बहुत बड़ी - कई फाइलें और/या लंबे फ़ाइल नाम मौजूद हैं।

+0

स्पष्टीकरण के लिए धन्यवाद! –

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