सीडी करता है। उपयोग है?


102

मैं जिन ट्यूटोरियल को संक्षेप में बता रहा हूं उनमें से एक का cd .कोई उपयोग नहीं है। जब प्रतीकात्मक लिंक पुनरावर्तन में ओपी द्वारा दिखाए गए मुद्दे को दोहराने की कोशिश की जा रही है - तो यह "रीसेट" क्या करता है? , मैंने भी कोशिश की cd ., जिसने ओपी वर्णित (बढ़ते हुए $PWDचर) के समान प्रभाव दिखाया , जिसके साथ मुकाबला किया जा सकता है cd -P

यह मुझे आश्चर्यचकित करता है, क्या कोई ऐसा मामला है जहां कोई वास्तव में उपयोग करना चाहता है cd . ?


20
मेरे पास एक कस्टम .zshrc है जो निर्देशिका को स्विच करते समय निर्देशिका पर विभिन्न चेक चलाता है, उदाहरण के लिए चेक में से एक है डायरेक्ट्री को चालू करते समय मैचिंग वर्चुअन को स्वचालित रूप से सक्रिय / निष्क्रिय करना। कभी-कभी, मैं एक नया शेल या जो कुछ भी शुरू कर सकता हूं, और वे चेक नहीं चलते हैं, और मैं आमतौर पर cd .उन चेक को ट्रिगर करने के लिए उपयोग करता हूं क्योंकि यह छोटा और सरल है। हालांकि मुझे लगता है कि आप इस सवाल का इरादा वेनिला पर्यावरण के लिए चाहते हैं।
रयान

29
(स्पष्ट) प्रभाव पर इसके अलावा $PWD, वर्तमान निर्देशिका में cd .भी परिवर्तन $OLDPWDहोता है। मेरे पास (वर्तमान में) कोई विचार नहीं है कि यह उपयोगी क्यों हो सकता है, लेकिन पूर्णता के लिए ...
एंड्रियास विसे

5
मुझे नहीं लगता कि मुझे कभी ज़रूरत है cd ., हालांकि नीचे दिए गए जवाबों को देखकर, मैं भविष्य में हो सकता हूं, लेकिन मैंने ऐसे अवसर का उपयोग किया है pushd .जब मैं popdबाद में इस निर्देशिका में वापस आने में सक्षम होना चाहता था । जैसे निर्माण स्क्रिप्ट करता चल रहा है जब configure, cd output...और make, और इसके पूर्ण होने पर मैं मूल निर्देशिका के लिए वापस जाना चाहता हूँ। बिल्डडस्क्रिप्ट की अपनी प्रतिलिपि को बनाए रखने के बजाय, जो हर किसी से अपेक्षा करता है, उससे अलग है, मैं इसे केवल के रूप में चलाता हूं pushd .; ./BuildScriptName.sh; popd, और यह मुझे popdकभी-कभी नहीं करने की स्वतंत्रता देता है , और फिर popdइसके बजाय बाद में।
डी

5
पाठ्यक्रम का उल्लेख नहीं है कि '।' और '..' सीडी कमांड में ही लागू नहीं होते हैं, इसलिए कोई भी उस विशिष्ट विशेषता को बनाने के लिए तैयार नहीं है, यह सिर्फ उन चीजों का एक संयोजन है जो बिना वास्तविक उद्देश्य के कार्य करता है।
डेविड एस

1
@ ओरक नोप, बाहरी कार्यक्रमों को शेल निष्पादन पर्यावरण को प्रभावित नहीं करना चाहिए। यह ज्यादातर POSIX अनुपालन के लिए है, जिसमें शेल के बाहर मौजूद कुछ उपयोगिताओं की आवश्यकता होती है, और बाहरी आदेशों की निकास स्थिति का मूल्यांकन करते हैं। आप /bin/cdयहाँ unix.stackexchange.com/q/50058/85039
Sergiy Kolodyazhnyy

जवाबों:


158

मुझे लगता है कि यह समस्या को खत्म कर रहा है। cd .हो सकता है कि कुछ ऐसा न हो जो चीजों के सामान्य पाठ्यक्रम में मैन्युअल रूप से चलेगा, लेकिन यह निश्चित रूप से कुछ ऐसा है जो प्रोग्रामेटिक निष्पादन में आ सकता है (किसी भी स्थिति के बारे में सोचें जहां आप cdउस निर्देशिका में हो सकते हैं जिसमें फ़ाइल हो, जिसका पथ उपयोगकर्ता द्वारा आपूर्ति की जाती है )। इसलिए, इसका कुछ विशिष्ट उपयोग नहीं है: जब तक यह सामान्य शब्दार्थ पूरा करता है cd <some-path>, तब तक यह उपयोगी है।


12
सहमत, सिंटैक्स .द्वारा cdठीक किए गए एक मान्य पथ के रूप में माना जाना चाहिए ।
सर्गी कोलोडियाज़नी

18
आप निम्न उदाहरण जोड़ सकते हैं: लूप्स जैसे समय IFS= read Dir; do cd "$Dir"; do_something; done < <(find . -type d)। अपने पाठ्यक्रम के दौरान, खोज .पथ के रूप में पैदा करता है, ताकि कमांड का cd "$Dir"विस्तार हो cd .। इसलिए, लिपियों में, यह पूरी तरह से उपयोगी है।
रेक्सकोगिटंस

5
उदाहरण के लिए, एक स्क्रिप्ट वास्तव में चलती है cd ${path_to_directory}, लेकिन कुछ बिंदु पर यह पता चला है कि निर्देशिका वर्तमान निर्देशिका है, और path_to_directory = .इसलिए आपको cd .केवल मामले में काम करने की आवश्यकता होगी ।
डेमिस

4
दूसरे शब्दों में, इसकी उपयोगिता इस तथ्य में है कि यह अतिरिक्त कोड ( ifचेक और elseक्लॉस, किसी भी प्रकार के विशेष आवरण) को अनावश्यक बनाता है ।
jpmc26

2
तो यह इस अर्थ में उपयोगी है कि x + 0 या x * 1 उपयोगी हैं - विशिष्ट ऑपरेशन प्रति se उपयोगी नहीं है, लेकिन इसका मतलब है कि आप 0 और 1 को किसी भी अन्य मूल्य के समान संभाल सकते हैं, उन्हें इलाज के बिना एक विशेष मामला।
user32929

127

अंतिम कमांड निष्पादित होने के बाद से डायरेक्टरी का रास्ता बदल सकता था, और cd .बैश और ksh93 गोले के बिना प्रश्न में जुड़े पोस्ट में वर्णित तार्किक कार्य निर्देशिका पर निर्भर करेगा, इसलिए कॉलिंग cd .जो शेल इश्यू को बनाता है getcwd()syscall आपके सुनिश्चित करेगा वर्तमान पथ अभी भी मान्य है।

बैश में प्रजनन के लिए कदम:

  1. एक टर्मिनल टैब समस्या में mkdir ./dir_no_1; cd ./dir_no_1
  2. एक अलग टर्मिनल टैब इश्यू में mv dir_no_1 dir_no_2
  3. पहले टर्मिनल टैब में echo $PWDऔर pwd। ध्यान दें कि निर्देशिका को बाह्य रूप से नाम दिया गया है; शेल का वातावरण अपडेट नहीं किया गया है।
  4. जारी करना cd .; pwd; echo $PWD। ध्यान दें कि मूल्य अद्यतन किया गया है।

ksh93, हालांकि, पर्यावरण की जानकारी को अपडेट नहीं करता है, इसलिए cd .ksh93 वास्तव में बेकार हो सकता है। में /bin/dashUbuntu और अन्य डेबियन-आधारित सिस्टम पर, cd .रिटर्न dash: 3: cd: can't cd to .त्रुटि, तथापि cd -P .(ksh93 में विपरीत) काम करता है।


22
यह जानने के लिए अच्छा है: मैं इसे बेकार की सूची में जोड़ दूंगा। ^ ^)
जॉयोइन

12
@ संजोइन ग्लैड I इस सूची में योगदान दे सकता है;)
सर्गी कोलोडियाज़नी

8
मुझे लगता है कि आप mv ../dir_no_1 ../dir_no_2एक ही टर्मिनल / बैश में कर सकते हैं ।
ctrl-alt-delor

3
@ ctrl-alt-delor ने पुष्टि की, काम करता है :)
सर्गी

1
@ymbirtt अधिकांश शेल में, pwdवास्तव में एक अंतर्निहित है, हालांकि /bin/pwdशेल के पर्यावरण पर कोई प्रभाव नहीं पड़ता है - सामान्य रूप से बाहरी उपयोगिताओं शेल वातावरण को प्रभावित नहीं करती हैं। अन्य चीजों के अलावा POSIX अनुरूपता के लिए कारण /bin/cdऔर /bin/pwdमौजूद है। बाहरी सीडी के बारे में एक अच्छी चर्चा है , जिनमें से कुछ के /bin/pwdरूप में अच्छी तरह से लागू होता है
सर्गी कोलोडाज़हनी

55

एक अन्य उपयोग का मामला cd .तब होगा जब आप वर्तमान में जिस निर्देशिका में हैं उसे हटा दिया गया है और फिर से बनाया गया है। निम्नलिखित प्रयास करने पर विचार करें -

  1. एक निर्देशिका बनाएँ temp
  2. cd temp और फिर ए ls
  3. एक और टर्मिनल खोलें और हटाएं और फिर उस निर्देशिका को फिर से बनाएँ temp
  4. पहले टर्मिनल से वापस, एक ls करने का प्रयास करें। इसके परिणामस्वरूप त्रुटि होगी -ls: cannot open directory .: Stale file handle
  5. cd . और फिर एक ls करना ठीक काम करता है

3
यह हमेशा काम नहीं करता है। उदाहरण के लिए, डैश में, आपको मिलेगा: cd: can't cd to .अब जब मैं इसे देखता हूं, तो यह पहले से ही सर्गियों के उत्तर में उल्लेखित है (चलती है, हटाना / फिर से बनाना - अनिवार्य रूप से वही: आप जिस निर्देशिका में हैं वह अब मूल में नहीं थी पथ)
ओलरिन

12
मैं यह बहुत परीक्षण दूरस्थ deploys का उपयोग करें। जिस निर्देशिका में मैं हटाऊंगा, उसे कुछ स्वचालन द्वारा फिर से बनाया जाएगा और मुझे cd .उसी नाम के साथ नई निर्देशिका में जाने के लिए जारी करने की आवश्यकता होगी ।
एचपी विलियम्स

2
मैं cd .हर समय उपयोग करता हूं जब मेरे पास एक शेल होता है जिसकी वर्तमान कार्यशील निर्देशिका sshfs के साथ मुहिम की गई थी, लेकिन ssh सत्र को बंद कर दिया गया है और फिर से खोल दिया गया है।
२२:५२

4
ऐसे मामले में मैं "सीडी $ पीडब्ल्यूडी" करता हूं। अन्य वेरिएंट काम कर सकते हैं, लेकिन यह एक स्पष्ट रूप से इरादे को व्यक्त करता है: जो मेरा वर्तमान पथ माना जाता है उसे निकालें (यानी PWDपर्यावरण चर की सामग्री पढ़ें ), फिर फाइल सिस्टम पदानुक्रम को रूट से नीचे चलाएं, एक निर्देशिका में नीचे तक पहुंचना वह रास्ता, चाहे वह वास्तव में एक ही निर्देशिका हो या नहीं। यह इस जवाब में उपयोग के मामले में बिल्कुल फिट बैठता है।
स्टीफन गौरिचोन

3
मैं वास्तव में आश्चर्यचकित हूं, यहां तक ​​कि चौंक गया, वह cd .काम करता है जब निर्देशिका को अनलिंक किया गया है और एक ही फाइल-सिस्टम पथ पर एक नई, अलग निर्देशिका बनाई गई है। वर्तमान कार्यशील निर्देशिका लिंक रद्द कर दिया गया है और संभवतः कि के हिस्से के रूप में, यह अब एक है .या ..प्रवेश, और भले ही यह किया था, .प्रविष्टि खुद को इंगित करते रहना चाहिए। ऐसा लगता है कि शेल या कर्नेल cd कमांड को निष्पादित कर रहा है, जो इस आधार पर है कि निर्देशिका पथ का नाम केवल .प्रविष्टि तक पहुंचने के बजाय था । क्या कोई उस व्यवहार की पुष्टि कर सकता है?
एड्रियन प्रैंक

36

आप $OLDPWDएक त्वरित के साथ स्पष्ट कर सकते हैं cd ., अगर ऐसा कोई मामला होना चाहिए जहां आप इसे "दिलचस्प" कहीं भी इंगित नहीं करना चाहते हैं। इसका भी असर पड़ेगा cd -


16

प्रोग्रामेटिक रूप से यह नो-ऑप के रूप में उपयोगी है। बाहरी इनपुट से प्रदान किए गए पथ पर विचार करें।

read -p "Path to file: " p
dirn=$(dirname "$p")
file=$(basename "$p")
echo "dirn=$dirn, file=$file"
cd "$dirn"
ls -ld "$file"

"Fred.txt" जैसे एक पथ के साथ निर्देशिका बन जाएगी ., जिसके लिए अग्रणी होगाcd .


1
यह उपयोगी है कि यह एक त्रुटि नहीं है अगर आप पहले से ही उस निर्देशिका में हैं जिसे आप नेविगेट कर रहे हैं, लेकिन मैं यह नहीं कहूंगा कि यह एक नो-ऑप के रूप में उपयोगी है।
कप्तान मैन

2
@CaptainMan एक त्रुटि नहीं फेंक रहा है अगर आप पहले से ही निर्देशिका में हैं (प्रभावी रूप से) एक सेशन नहीं। dirnameआदेश उत्पन्न .जहां आवश्यक तोड़ने कोड है कि एक पथ विभाजित करने के लिए सक्षम होने के लिए उम्मीद से बचने के लिए।
रोज़ा

15

यह सामान्य है अगर आपको खराब यूएसबी केबल के साथ काम करना था। एक डिवाइस के डिस्कनेक्ट हो जाने और फिर से कनेक्ट होने के बाद, उसी डायरेक्टरी में आटोमेटिक होने पर, आपको cd .इसे फिर से काम करने के लिए उपयोग करना होगा।


1
क्या यह निर्भर नहीं करेगा कि किस प्रकार का उपकरण, यह कैसे एक्सेस किया जा रहा है, इसकी फाइल सिस्टम, OS, और c?
gidds

ओएस, शायद। यह संभावना नहीं है कि फ़ाइल सिस्टम प्रासंगिक है, जब तक कि कर्नेल इसका उपयोग नहीं कर पाता है जब तक इसका उपयोग किया जा रहा है। किसी भी मामले में, कमांड का सही स्थिति में उपयोग होता है।
user23013

11

ध्यान दें कि "।" है फ़ाइल है कि (बेशक एक खोल प्रक्रिया सहित), और किसी भी प्रक्रिया के वर्तमान कार्यशील निर्देशिका के रूप में खुला है का नाम निर्दिष्ट करने के लिए उचित तरीके से "।" किसी भी और सभी निर्देशिकाओं में एक फ़ाइल का हमेशा मान्य नाम होता है, जिसमें वर्तमान कार्यशील निर्देशिका भी शामिल है। नाम .किसी प्रक्रिया के दिए गए उदाहरण के लिए किसी फ़ाइल के लिए मान्य नाम नहीं हो सकता है, यदि कहें, अंतर्निहित वर्तमान कार्यशील निर्देशिका को हटा दिया गया है (या "खराब", जैसे बासी NFS हैंडल), लेकिन यह एक मान्य नाम है हर वैध निर्देशिका में मौजूद होने की गारंटी है।

तो किसी भी कमांड के लिए एक मान्य तर्क . होना चाहिए जो एक निर्देशिका के नाम को स्वीकार करता है, और इस प्रकार मानक शेल में cd .एक मान्य कमांड होना चाहिए।

चाहे cd .उपयोगी है या नहीं खोल कार्यान्वयन पर निर्भर करता है। जैसा कि उल्लेख किया गया है कि यह उपयोगी हो सकता है यदि शेल अंतर्निहित chdirसिस्टम कॉल को कॉल करने के बाद वर्तमान कार्यशील निर्देशिका के पूर्ण पथनाम के अपने आंतरिक विचार को रीसेट करता है , उदाहरण के लिए यदि अंतर्निहित निर्देशिका (या इसके कुछ माता-पिता) का नाम बदला गया है।

कम से कम कुछ गोले जिन्हें मैं जानता हूं ( /bin/shFreeBSD और NetBSD पर) में परिवर्तित cd ""हो जाएगा cd ., जो एक शेल स्क्रिप्ट में प्रोग्रामेटिक उपयोग का समर्थन करने के लिए एक सुविधा का वर्णन किया जा सकता है, जहां एक चर को पैरामीटर के रूप में इस्तेमाल किया जा सकता है (अर्थात एक खाली चर प्रतिस्थापन में " कुछ भी न करें "परिणाम), हालांकि FreeBSD प्रतिबद्ध इतिहास कहता है कि विफलता को रोकने के लिए POSIX समर्थन को जोड़ने के कारण परिवर्तन सीधे था chdir(""), जिसे POSIX जनादेश विफल होना चाहिए।

कुछ अन्य गोले .अपने वर्तमान कार्य निर्देशिका के लिए पूरी तरह से योग्य पथनाम के रूप में संग्रहीत किए गए के साथ प्रतिस्थापित करेंगे, और इस प्रकार उनके लिए यह साहिल अग्रवाल के उत्तर में उल्लिखित व्यवहार के लिए अनुमति दे सकता है ।


4

मैंने इस कमांड का उपयोग आज ही किया जब मैंने Git में काम करने वाली शाखा को रिबूट किया था, एक निर्देशिका के भीतर जो पहली बार उसी शाखा पर बनाई गई थी। रिबास ठीक चला लेकिन बाद में, git statusएक त्रुटि फेंक दी। cd .सब कुछ सामान्य होने के बाद ।

(मैं विंडोज़ पर संयोग से MobaXterm में काम कर रहा था। बस अगर आप इसे पुन: उत्पन्न करने की कोशिश कर रहे हैं। यह अन्य प्रणालियों पर नहीं हो सकता है।)


मैंने इस कमांड का उपयोग उन निर्देशिकाओं में भी किया है जो एक स्वचालित प्रक्रिया द्वारा ताज़ा होती हैं जो पुरानी निर्देशिका को अलग करती है और इसे एक नए के साथ बदल देती है (इसलिए यह यथासंभव परमाणु के करीब है)। सामान्य स्थिति नहीं है, लेकिन cd .वास्तव में इसकी आवश्यकता है।


स्टीफन चेज़लस के इस बेहतरीन जवाब को पढ़ने के बाद:

अब मैं समझता हूं कि मेरे उपयोग के मामले केवल काम के ऊपर हैं क्योंकि मैं उपयोग कर रहा हूं bash, जिसमें cd .इसके बराबर है cd "$PWD"। मैं लिंक किए गए उत्तर को पढ़ने की अत्यधिक सलाह देता हूं।


1

मैं एक समारोह के माध्यम से cd .मेरे द्वारा अधिभारित सामान को पुन: उपयोग करने के लिए उपयोग करता हूं । cdbash

मेरे से ~/.bashrc:

# from the "xttitle(1)" man page - put info in window title
update_title()
{
    [[ $TERM = xterm ]] || [[ $TERM = xterm-color ]]  && xttitle "[$$] ${USER}@${HOSTNAME}:$PWD"
}

cd()
{
    [[ -z "$*" ]] && builtin cd $HOME
    [[ -n "$*" ]] && builtin cd "$*"
    update_title
}

0

EDIT: यह साहिल द्वारा पहले ही सुझाया जा चुका है ।

यह उपयोगी है यदि आप एक फ़ोल्डर के अंदर हैं जो हटा दिया गया है और किसी अन्य प्रक्रिया द्वारा पुनः बनाया गया है। उदाहरण के लिए, दो टर्मिनल सत्र संभालने $1और $2:

$1 mkdir d
$1 cd d
$1 touch f

$2 rm -rf /path/to/d # delete the folder where $1 is in ...
$2 mkdir /path/to/d # ... and recreate it

$1 touch g # cannot create file g because current dir doesn't exist anymore
touch: cannot touch ‘g’: Stale file handle
$1 cd . # go to the newly created dir (same path)
$1 touch g # works fine now

मुझे यकीन नहीं है कि जहां वास्तव में (ओएस, शेल, ...?) इस व्यवहार का मूल कारण है।


यह अन्य उत्तरों द्वारा पहले ही उल्लेख किया जा चुका है।
Kusalananda

-8

नहीं, इसका कोई अर्थ नहीं है। न तो स्क्रिप्टिंग में, यह सिर्फ कुछ नहीं करता है।


2
शेल के आधार पर, यह रीसेट हो जाएगा $PWD, और यह संभवतः अन्य शेल फ़ंक्शन को कॉल करेगा यदि उपयोगकर्ता ने अपने स्वयं के cdफ़ंक्शन या उपनाम को अंतर्निहित ओवरलोड करने के लिए प्रदान किया है cd। यह भी सत्यापित करेगा कि वर्तमान निर्देशिका अभी भी मान्य है और वर्तमान उपयोग की अनुमति है।
Kusalananda

1) निश्चित रूप से हम "सीडी" के संभावित कस्टम उपनामों के बारे में बात नहीं कर रहे हैं, लेकिन मानक 2 का निर्माण) वर्तमान उपयोग कैसे हो सकता है अगर इसकी कोई अनुमति नहीं थी? इसे सरल बनाने के लिए मैं सिर्फ इतना कहता हूं कि वास्तविक दुनिया में मेरे विचार में इसका उपयोग करने का कोई कारण नहीं है।
फेडेरिको

1
1) हम नहीं हैं? 2) वास्तविक दुनिया सरल नहीं है, और यूनिक्स एक बहु-उपयोगकर्ता ऑपरेटिंग सिस्टम है। एक उपयोगकर्ता निर्देशिकाओं पर अनुमतियाँ बदल सकता है, और यदि स्क्रिप्ट, या किसी अन्य उपयोगकर्ता का इंटरेक्टिव शेल, उस निर्देशिका (या एक उपनिर्देशिका) को उसके कार्यशील निर्देशिका के रूप में cd .होता है , तो वह शिकायत करेगा।
Kusalananda

4
Federico, साइट के नियमों और मेरे अपने व्यक्तिगत नियमों के अनुसार, मुझे आपके उत्तर को रद्द कर देना चाहिए। हालाँकि, आप नए हैं। स्वागत हे! कृपया कुछ अन्य उत्तरों की समीक्षा करें । उसके बाद, यदि आपको लगता है कि आपका उत्तर गलत है, तो कृपया इसे हटा दें। कृपया इस प्रश्न और अन्य के उत्तर देने का आनंद लें।
daveloyall

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