2012-01-19 14 views
9

मैं एक उपनाम है जो जो एक निर्दिष्ट फ़ाइल CWD के वंशज निर्देशिका पर चला जाएगा (या पहले find इस तरह के एक फ़ाइल नाम के पाया घटना) लिखने के लिए कोशिश कर रहा हूँ:बैश: उर्फ ​​कारण समस्याओं में नेस्टेड बैकटिक

निम्न आदेश संयोजन वांछित परिणाम प्राप्त होता है:

cd `dirname \`find -name 'MyFile.txt' | sed -n 1p\`` 

हालांकि, मैं एक काम कर अन्य नाम बनाना सही तरीके से इस से बचने के लिए प्रतीत नहीं कर सकते हैं:

alias jump="cd \`dirname \\\`find -name '$1' | sed -n 1p\\\`\`" 
,210

आउटपुट:

/* 
dirname: missing operand 
Try `dirname --help' for more information. 
bash: cd: find: No such file or directory 

मेरे तर्क यह है कि बैकटिक एक भी \ के साथ एक डबल उद्धृत स्ट्रिंग में से बचने की जरूरत है और मैं \\ ऐसा नहीं कर सकते एक स्ट्रिंग के भीतर एक भी बैकस्लैश में अनुवाद किया जाता है, ताकि दूसरे नेस्टेड बैकटिक की आवश्यकता है 1 + 2 = 3।

कोई सुझाव?

उत्तर

13

उपनाम $1 की तरह एक तर्क नहीं ले सकते। बजाय एक समारोह का उपयोग करें।

बैकटिक्स के बजाय कमांड प्रतिस्थापन के लिए $(command) का भी उपयोग करें, क्योंकि यह घोंसला आसान है।

समारोह होगा:

jump() { 
    cd $(dirname $(find -name "$1" | sed -n 1p)) 
} 
+0

डॉलर की जानकारी के लिए हर किसी के लिए धन्यवाद। इस दृष्टिकोण का उपयोग कर किसी अन्य नाम बनाने का तरीका - विशेष धन्यवाद सही प्रश्न मैंने पूछा जवाब देने के लिए dogbane करने के लिए। – KomodoDave

3

Backticks नेस्टिंग प्रदान नहीं करता है। command substitution जो वाक्य रचना $(..)

है आपके मामले में उपयोग करने का प्रयास यह

cd $(dirname $(find /path/to/search -name 'MyFile.txt' | sed -n 1p)) 
+0

बैकटिक प्रस्ताव नेस्टिंग करते हैं, लेकिन आप उन्हें बैकस्लैश, जो तेज़ी से अनेक नेस्टिंग के स्तर के लिए बोझल हो जाता है साथ भागने के लिए किया है। '$ {} ..' वाक्य रचना आंखों पर बहुत आसान है। – mjuarez

2

बैकटिक command substitution के पुराने रूप है हो जाएगा, और आप उन्हें आसानी से घोंसला नहीं कर सकता। हालांकि, नए $()form आसानी से घोंसला करता है:

cd $(dirname $(find -name 'MyFile.txt' | sed -n 1p)) 
संबंधित मुद्दे