यदि $ PWD किसी दिए गए पथ का उपनिर्देशिका है तो कैसे जांचें


25

उदाहरण के लिए जाँच करें कि $PWDक्या एक उपनिर्देशिका / घर है। दूसरे शब्दों में, मैं यह जांचने के लिए बैश स्ट्रिंग ऑपरेशन खोज रहा हूं कि क्या एक स्ट्रिंग दूसरे के साथ शुरू होती है।

जवाबों:


26

यदि आप मज़बूती से परीक्षण करना चाहते हैं कि क्या एक निर्देशिका दूसरे की उपनिर्देशिका है, तो आपको एक स्ट्रिंग उपसर्ग चेक से अधिक की आवश्यकता होगी। गिल्स के जवाब में विस्तार से बताया गया है कि यह परीक्षण कैसे ठीक से किया जाए।

लेकिन अगर आप एक साधारण स्ट्रिंग प्रीफिक्स चेक चाहते हैं (हो सकता है कि आपने पहले से ही अपने रास्तों को सामान्य कर लिया है?), यह एक अच्छा है:

test "${PWD##/home/}" != "${PWD}"

यदि $PWD"/ home /" से शुरू होता है, तो यह बाईं ओर से हट जाता है, जिसका अर्थ है कि यह दाईं ओर से मेल नहीं खाएगा, इसलिए "! =" सही है।


1
+1 सही, और अधिक सामान्य मामले के लिए: [ "${PWD##$VAR}" != "$PWD" ]और अगर यह एक [कोड-गोल्फ] ( stackoverflow.com/questions/tagged/code-golf)question था, तो आपने मुझे दो वर्णों से पीटा होगा; ;-) यह भी दिखता है अधिक पठनीय ...
टोबियास किन्ज़लर

FWIW, यह भी उपयोगी हो सकता है:${PWD/#$HOME/\~}
user1338062

ठीक है, लेकिन कैसे पीडब्लूडी = "/ घर /../ आदि /" के बारे में
एलेक्सिस पीटर्स

1
@AlexisPeters: आप सही हैं: मैं प्रश्न के "स्ट्रिंग उपसर्ग" पर ध्यान केंद्रित कर रहा था, और मैंने इसे और अधिक स्पष्ट करने के लिए संपादित किया है। गिल्स ने उपनिर्देशिकाओं की जांच करने के लिए उचित तरीके से अच्छी तरह से कवर किया है।
जैंडर

1
"${PWD%%/subdir*}"यह पता लगाने के लिए उपयोग करें कि क्या उपयोगकर्ता वर्तमान में subdirया उपनिर्देशिका में है subdir, क्योंकि %% शुरुआत के बजाय स्ट्रिंग के अंत से कैप्चर करता है। पैरामीटर प्रतिस्थापन पर अधिक जानकारी के लिए यह किसी के लिए उपयोगी होना चाहिए: tldp.org/LDP/abs/html/parameter-substitution.html
जॉर्ज Pantazes

33

यह जांचने के लिए कि क्या कोई स्ट्रिंग किसी बॉर्न-शैली के शेल में दूसरे का उपसर्ग है:

case $PWD/ in
  /home/*) echo "home sweet home";;
  *) echo "away from home";;
esac

एक ही सिद्धांत प्रत्यय या प्रतिस्थापन परीक्षण के लिए काम करता है। ध्यान दें कि caseनिर्माण में, फ़ाइल नामों के विपरीत, *किसी भी वर्ण से मेल खाता है, जिसमें एक /प्रारंभिक या एक प्रारंभिक शामिल है .

[[ … ]]सिंटैक्स (यानी बैश, ksh और zsh) को लागू करने वाले गोले में , यह एक पैटर्न के खिलाफ एक स्ट्रिंग से मेल खाने के लिए इस्तेमाल किया जा सकता है। (ध्यान दें कि [कमांड केवल समानता के लिए तारों का परीक्षण कर सकता है।)

if [[ $PWD/ = /home/* ]]; then 

यदि आप विशेष रूप से परीक्षण कर रहे हैं कि क्या वर्तमान निर्देशिका नीचे है /home, तो एक साधारण सबस्ट्रिंग टेस्ट पर्याप्त नहीं है, क्योंकि प्रतीकात्मक लिंक हैं।

यदि /homeअपनी स्वयं की एक फाइलसिस्टम है, तो परीक्षण करें कि क्या वर्तमान डायरेक्टरी ( .) उस फाइलसिस्टम पर है।

if [ "$(df -P . | awk 'NR==2 {print $6}')" = "/home" ]; then
  echo 'The current directory is on the /home filesystem'
fi

यदि आपके पास NetBSD, OpenBSD या GNU (यानी लिनक्स) है readlink, तो आप readlink -fएक पथ से प्रतीकात्मक लिंक को हटाने के लिए उपयोग कर सकते हैं ।

case $(readlink -f .)/ in $(readlink -f /home)/*) 

अन्यथा, आप pwdवर्तमान निर्देशिका को दिखाने के लिए उपयोग कर सकते हैं । लेकिन आपको इस बात का ध्यान रखना चाहिए कि एक शेल बिल्ट-इन का उपयोग न करें यदि आपका शेल cdकमांड को ट्रैक करता है और आपके द्वारा उपयोग किए जाने वाले नाम को इसके "वास्तविक" स्थान के बजाय निर्देशिका तक पहुंचाता है।

case $(pwd -P 2>/dev/null || env PWD= pwd)/ in
  "$(cd /home && { pwd -P 2>/dev/null || env PWD= pwd; })"/*) 

+1 इस संपूर्ण उत्तर के लिए धन्यवाद। मैंने इसे पूछने पर लिंक और फाइल सिस्टम की ख़ासियत पर विचार नहीं किया, लेकिन यह निश्चित रूप से जानना अच्छा है
टोबीस किन्ज़्लर

8

क्रूड संस्करण:

[ ${PWD:0:6} = "/home/" ]

नुकसान यह है कि किसी को पहले वर्णों को गिनना पड़ता है और किसी को /home/कुछ सामान्य की तरह प्रतिस्थापित नहीं किया जा सकता है $1

$VARएक के साथ तुलना करने के लिए सामान्यीकरण के लिए संपादन (धन्यवाद @ मिचेल) कर सकते हैं

[ "${PWD:0:${#VAR}}" = $VAR ]

4
${#var}की लंबाई है $var, इसलिए आप इसे सामान्य कर सकते हैं[ "${PWD:0:${#1}}" = "$1" ]
माइकल Mrozek


2

मुझे सवाल बहुत अच्छी तरह से समझ में नहीं आता है, लेकिन $ PWD के माता-पिता को खोजने के लिए , क्या करें dirname $PWD। माता-पिता के बच्चे को खोजने के लिए, भागो dirname $(dirname $PWD), और इसी तरह ...


यह तभी काम करेगा जब मुझे गहराई का पता चल जाए, अन्यथा मैं खत्म हो जाऊंगा /। ठीक है, मैं पुनरावर्ती जाँच कर सकता हूं, लेकिन क्या कुछ आसान नहीं है?
टोबियास किंजलर

1
@tob यदि मैं केवल शेल प्रोग्रामिंग जानता था ;-)
tshepang 16

1

का उपयोग कर awk:

echo $PWD | awk -v h="/home" '$0 ~ h {print "MATCH"}'

काम करने के लिए +1, लेकिन देशी बैश टेस्ट की तुलना में थोड़ा धीमा
टोबीस किंजलर

0

हम्म, यह दया है कि [परीक्षण की STRING1 starts with STRING2स्थिति का एक विकल्प नहीं है ।

आप कोशिश echo $PWD | grep '^$VAR'कर सकते हैं, लेकिन VARविशेष प्रतीकों में शामिल होने पर यह दिलचस्प तरीकों से विफल हो सकता है ।

awkके indexसमारोह चाल करने के लिए सक्षम होना चाहिए। लेकिन यह सब परीक्षण के लिए इतनी आसान चीज के लिए बहुत भारी लगता है।


[[तो यो प्राप्त startswith [[$ पीडब्ल्यूडी = ~ ^ \ / घर \ /]] regexp करता है
teknopaul

0

यदि पथ का खोजा गया भाग मुझे चर "खाली" लगता है:

[[ -z "${PWD//*\/home\/*/}" ]] && echo "toto"
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.