कमांड खोजने में '{}' और {} में अंतर है?


18

में प्रलेखन , मैं उपयोग दोनों तरीकों से देखें:

find . -type f -exec file '{}' \;

find repo/ -exec test -d {}/.svn -o -d {}/.git -o -d {}/CVS ; \

4
निश्चित रूप से ऐसा लगता है कि इसे खोजने, कमांड से कोई लेना-देना नहीं है, और इसके बजाय कमांड को बुलाए जाने के लिए उचित उद्धरण के साथ करना है।
20

1
इसे बैश के बजाय मछली के साथ आज़माएं।
चार्ल्स डफी

जवाबों:


24

के लिए bashखोल, '{}'और {}परस्पर विनिमय कर रहे। सभी गोले (जैसे fish) के साथ ऐसा नहीं है ।

तर्क को एकल उद्धरणों में रखना स्पष्ट रूप से इंगित करता है कि घुंघराले ब्रेसिज़ को भेजा जाना चाहिए find। उपयोग के आधार पर, बैश शेल कभी-कभी घुंघराले ब्रैकेट की सामग्री को प्रतिस्थापित करता है।

जैसा कि नीचे देखा गया है, बैश खाली ब्रैकेट्स को प्रतिस्थापित नहीं करता है, और वे कमांड में पास हो जाते हैं। के लिए findआदेश में, यह कोई फर्क नहीं पड़ता।

$ echo {}
{}

$ echo {1}
{1}

$ echo {1,3}
1 3

$ echo '{1,3}'
{1,3}

4
बैश के साथ कोई फर्क नहीं पड़ता। मछली से कोई फर्क नहीं पड़ता।
चार्ल्स डफी

1
मैं की जगह चाहते हैं " are interchangeable"के साथ " are interchangeable in some shells, not in all of them. ALWAYS use the single quotes to make sure they get passed as-is to the find command"(सुनिश्चित करें कि आप सही तरीके से उपयोग भले ही आप हमेशा के लिए (हो बनाकर अच्छी आदतें शुरू होता है) एक प्रणाली है कि अस्पष्ट एक की अनुमति देता है पर हो सकता है?)
ओलिवर Dulac

9

लगभग सभी शेल दुभाषिया उपलब्ध होने के साथ '{}'और इसके बीच कोई अंतर नहीं है {}

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

  • 'a b' एक एकल तीन वर्ण पैरामीटर है, बिना उद्धरण के जो दो एकल वर्ण पैरामीटर होंगे
  • '$b' वस्तुतः डॉलर का अक्षर अक्षर बी होता है, उद्धरण के बिना जो भी बी चर होता है और संभवत: कुछ भी नहीं होता है
  • '!!' अस्वाभाविक होते हुए और कुछ संवादात्मक गोले के साथ लिबरल विस्मयादिबोधक चिह्न हैं, वे इतिहास में अंतिम कमांड में विस्तारित होंगे
  • '*' एक कूड़े वाला तारांकन चिह्न है, जिसे अछूता इसे वर्तमान निर्देशिका में गैर छिपे हुए फ़ाइल नाम की सूची से बदल दिया जाएगा।

न POSIX मानक है और न ही मुख्यधारा के गोले के रूप में ( sh(बॉर्न), ksh, bash, ash, dash, zsh, csh, tcsh) का विस्तार {}कुछ और करने के लिए, उद्धरण आवश्यकता नहीं है।

हालांकि, एक विदेशी शेल है, जिसका नाम है fish, जो {}एक खाली स्ट्रिंग के रूप में विस्तारित होता है , जैसे:

> ps -p %self
  PID TTY          TIME CMD
 5247 pts/1    00:00:00 fish
> echo a {} b '{}'
a  b {}

शायद यही कारण है कि GNU findप्रलेखन {}उद्धरण या बैकस्लैश के साथ व्याख्या से बचाने के लिए सुझाव देता है ।


9

अधिकांश उपयोगकर्ताओं के लिए (विशेषकर जो POSIX गोले का उपयोग कर रहे हैं), कोई अंतर नहीं है।

GNU के लिए मैन पेज के उदाहरण अनुभाग के अनुसार find:

ध्यान दें कि ब्रेस को एकल स्क्रिप्ट चिह्नों में संलग्न किया गया है ताकि उन्हें व्याख्या से खोल स्क्रिप्ट विराम चिह्न के रूप में संरक्षित किया जा सके।

मुझे लगता है कि ग्नू मैन पेज के लेखक (नों) सावधानी के पक्ष में हैं, लेकिन मैं ध्यान देता हूं कि उनके मैन पेज के सभी उदाहरण ब्रेसिज़ को उद्धृत नहीं करते हैं। आधिकारिक GNU के इन उदाहरणों से पता चलता है कि प्रलेखन भी उद्धरण को छोड़ देता है।

में POSIX / एकल यूनिक्स विशिष्टता से उदाहरण ब्रेसिज़ रहे उद्धृत नहीं जब साथ प्रयोग किया -execविकल्प।

POSIX शेल के साथ, पैरामीटर विस्तार केवल तब होता है जब ब्रेसिज़ के भीतर संलग्न विशेष पैरामीटर होते हैं - लेकिन खाली ब्रेसिज़ के साथ नहीं

बैश शैल में ब्रेस विस्तार एक (गैर-पोर्टेबल) विशेषता के रूप में शामिल है, लेकिन ऐसे पैटर्न केवल तभी विस्तारित होते हैं जब कॉमा या डॉट्स ब्रेस के भीतर शामिल होते हैं । बैश भी कमांड ग्रुपिंग के लिए ब्रेसिज़ का उपयोग करता है , लेकिन यह तब तक नहीं होता है जब तक कि वास्तव में ब्रेस के भीतर कमांड का एक समूह न हो ।

अंत में, मैं चलाने का भी प्रयास find -exec ls -l {} \;में sh, dashऔर tcshलेकिन इन गोले में से कोई भी विस्तार किया {}और कुछ में। जैसा कि अन्य ने बताया है, fishशेल {}विशेष रूप से व्यवहार करता है लेकिन यह एक पॉसिक्स शेल नहीं है (जिसे इसके निर्माता और उपयोगकर्ता एक लाभ मानते हैं)। यह ब्रेसिज़ को उद्धृत करने के लिए कोई नुकसान नहीं करता है, लेकिन आलसी टाइपिस्ट जो मछली के खोल का उपयोग नहीं करते हैं, उन्हें छोड़ने के बारे में दोषी महसूस नहीं करना चाहिए।


वे ग़लती नहीं कर रहे हैं, वे यह सुनिश्चित करने की कोशिश कर रहे हैं कि लोग सही तरीके का उपयोग करें (अर्थात '{}'इसके बजाय का उपयोग करें {}) ताकि उनकी शेल {}इसे खोजने के बिना खोज कमांड को भेजें (जैसा कि ऊपर उल्लेख किया गया है @ चार्ल्स-डफी, यदि आप मछली का उपयोग करने के लिए होते हैं। , यह व्याख्या करेगा, {}लेकिन नहीं '{}', इसलिए आपको उस शेल पर उत्तरार्द्ध (और कई अन्य लोगों पर!) का उपयोग '{}'करने की आवश्यकता है । इसलिए, हमेशा {}
ओलिवियर दुलैक 5'15

6

यह आपके शेल के सिंटैक्स पर निर्भर करता है। जब संदेह में, यह गूंज!

इसे चलाओ

echo '{}'

और इस।

echo {}

यदि वे एक ही आउटपुट का उत्पादन करते हैं, तो आपके शेल के लिए उत्तर हां है। जैसा कि अन्य ने उल्लेख किया है, यह कम से कम हाश में होगा और मछली में नहीं। आउटपुट, वह है जिसे आपको किसी दिए गए कमांड के मैनपेज के लिए परामर्श करना चाहिए।


यदि आप काम करना चाहते हैं, तो आप echoपूरी कमांड लाइन के लिए उपसर्ग भी कर सकते हैं, वास्तविक कमांड को देखने के लिए , इसके सभी तर्कों के साथ, कि आपका शेल वास्तव में आह्वान करेगा। हालांकि, सावधान रहें कि कमांड प्लस तर्कों वाली सूची सही मायने में स्ट्रिंग है, प्रत्येक संभवतः खाली है या व्हॉट्सएप के साथ है, फिर भी गूंज एक अंतरिक्ष अलग सूची के रूप में अस्पष्ट रूप से प्रिंट करता है।

जैसा कि इस थोड़े अधिक वर्बोज़ इको कमांड (गुइलेट-उद्धृत तर्कों को दिखाते हुए) के साथ सत्यापित किया जा सकता है,

#!/bin/sh
for a in "$@"; do
    printf '«%s» ' "$a"
done
echo ''

इसे कमांड लाइन पर टाइप करें,

find 'My Documents and Settings' -type f -exec file {} \;

इसका मतलब यह है कि मारना:

«find» «My Documents and Settings» «-type» «f» «-exec» «file» «{}» «;»

और यह मछली में:

«find» «My Documents and Settings» «-type» «f» «-exec» «file» «» «;»

एक सामान्य सलाह के रूप में, यह बोली लगाने के लिए कभी दर्द नहीं देता है।

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