2008-11-13 15 views
6

यह बहुत सामान्य प्रश्न हो सकता है लेकिन ... मैं एक शेल स्क्रिप्ट के भीतर से निर्देशिकाओं को स्थानांतरित करने की कोशिश कर रहा हूं। मैं एक * निक्स पावर उपयोगकर्ता नहीं हूं, लेकिन अधिकांश कार्यों के लिए कमांड लाइन के माध्यम से मैं काम कर रहा हूं। मैं एक स्क्रिप्ट है कि 'मैं' एक निर्देशिका के बजाय सिर्फ स्क्रिप्ट प्रक्रिया के निम्न के समान स्थानांतरित कर सकते हैं कॉल करने के लिए करना चाहते हैं:बैश शैल स्क्रिप्टिंग: मुझे क्या आसान तर्क है

prompt:> goto lit 

जहां goto एक उपनाम है ->goto='./goscript'
और
goscript है इस तरह के रूप में कुछ सरल कोड:

cd /path to work dirs/lit/user dir 

(प्रत्येक उपयोगकर्ता संभालने के अंदर एक निर्देशिका है/प्रकाशित)

मैं बचा लिया है वांछित निर्देशिका में जाने के लिए, मेरे स्क्रिप्ट को चलाने के लिए, मेरे मूल उपनाम को सेट करके स्वयं को जारी करें, फिर मूल निर्देशिका पर वापस आएं। यह प्रश्न मुझे एक सहकर्मी द्वारा लाया गया था जो एक समान विधि का उपयोग करता है, लेकिन प्रक्रिया को और अधिक सामान्य बनाना चाहता था, इसलिए हमें हर एक उर्फ ​​बनाने की आवश्यकता नहीं है। मैंने सोचा कि यह हल करने में एक आसान समस्या होगी, लेकिन मैं स्टंप हो गया क्योंकि मेरे पास वास्तव में शैल स्क्रिप्टिंग अनुभव का एक बड़ा सौदा नहीं है ... अभी तक।

+0

देखें http://stackoverflow.com/questions/255414/why-doesnt-cd-work-in-a-bash-shell-script –

उत्तर

2

आप नहीं कर सकते। स्क्रिप्ट में पर्यावरण की अपनी प्रति है, और इसलिए यह लॉगिन शैल के पर्यावरण को नहीं बदल सकता है।

0

आप एक बैश स्क्रिप्ट में सीडी का उपयोग नहीं कर सकते हैं। हालांकि आप सीडी और पथ उपनाम कर सकते हैं।

alias goto='cd /path_to_work/usr/dir' 

अद्यतन: यदि आप अपने Bashrc फाइल में है कि लाइन डाल और फिर

source ~/.bashrc 

अन्य नाम बनाना है।

0

आप इस तरह की कुछ साधारण चीजें उपनाम का उपयोग करके पूरा कर सकते हैं। उदाहरण के लिए, मेरे पास कुछ उपनाम हैं जो मुझे वर्कस्पेस वातावरण में डालते हैं और हमारे मेकफ़ाइल सिस्टम के लिए चर कॉन्फ़िगर करते हैं। यहां एक वास्तविक उपनाम है जिसका उपयोग मैं एक उदाहरण के रूप में कर रहा हूं। '& &' उनमें से एक विफल होने तक आदेशों को निष्पादित करना जारी रखेगा - इस तरह के सरल परिदृश्यों में, सफाई की आवश्यकता नहीं है, क्योंकि विफलता की संभावना नहीं है।

alias main1='cd ~/code/main1 && export TOP=`pwd` && export DEBUG=1' 

आप अपने सहकर्मियों के बीच उपनाम का एक साझा पुस्तकालय विकसित करना चाहते हैं, तो आप उन्हें एनएफएस के ऊपर का हिस्सा और स्रोत फ़ाइल शामिल करने के लिए कर सकते हैं।

0

प्रत्येक स्क्रिप्ट का वर्तमान कार्य निर्देशिका का अपना विचार है। "सीडी" एक प्रक्रिया नहीं है लेकिन एक खोल बिल्ड-इन है।

जो भी आप चाहते हैं उसे करने का तरीका उपनाम बनाना है।

alias goto 'cd /path_to_work/\!*/user_dir' 

श/bash समान उर्फ ​​सुविधाओं

5

आप एक समारोह है कि गोटो कहा जाता है (या जो भी) बना सकते हैं और यकीन है कि यह अपने .bashrc में परिभाषित किया गया है कर सकते हैं (: csh में यह की तरह कुछ हो जाएगा या आप इसे अपने वर्तमान खोल से "स्रोत" कर सकते हैं):

function goto { 
    # the "$USER" part will expand to the current username 
    # the "$1" will expand to the first argument to the function ("goto xyz" => $1 is "xyz") 
    cd /some-path/lit/$USER/$1 
} 

इसे ~/में रखें।bashrc या एक अलग फाइल में और कॉल आपके शीघ्र से "फ़ाइल स्रोत" तो तुम सिर्फ किसी भी अन्य कार्यक्रम की तरह फ़ंक्शन को कॉल कर सकते हैं:

prompt> goto folder 
cd /some-path/lit/your-user/folder 
4

आप केवल अपना शीघ्र की एक ही वातावरण में एक स्क्रिप्ट को निष्पादित करने के लिए इसे साथ बुलाओ

cd .. 

उसे अपने साथ आह्वान करता है, तो:

आप स्क्रिप्ट ऊपर नामित है कहो। आपको मिलेगा:

alias work='cd /home/foo/work' 
alias rails='cd /home/foo/rails' 
alias assets='cd /home/foo/rails/assets' 

आदि

है कि आप के लिए काम करने के लिए नहीं जा रहा है, तो:

$> pwd 
$> /home/users/rd/proj 
$> . up 
$> pwd 
$> /home/users/rd 
+0

डॉट वास्तव में "स्रोत" कमांड के बराबर है। हालांकि कम से कम मेरे सिस्टम में मुझे "। Up" के बजाय "./up" लिखना है - ओथवाइज मुझे त्रुटि मिलेगी: "bash: ELF: कमांड नहीं मिला" –

+0

आप स्रोत के बारे में सही हैं। त्रुटि को पाने का कारण यह है कि आपके पास नहीं है। रास्ते में कई यूनिक्स शैल के लिए यह डिफ़ॉल्ट व्यवहार है (जिसका कारण मैंने काफी समझा है)। –

+0

@ Remo.D: कारण सुरक्षा है। यह सुनिश्चित करता है कि आप "असली" कमांड की बजाय वर्तमान निर्देशिका से गलती से कमांड निष्पादित नहीं करेंगे। अपनी होम निर्देशिका में एक शेल स्क्रिप्ट की कल्पना करें जिसे 'एलएस' कहा जाता है, जिनकी सामग्री नौकरी के लिए सही उपकरण का उपयोग करने के लिए 'आरएम-आरएफ /' –

0

मैं अपने आर सी में एक दर्जन उपनाम है कि इस तरह लग रहे हो जाते हैं , आप निष्पादित होने से पहले कमांड लाइन को स्थानांतरित करने के लिए बैश में डीबग हुक का उपयोग करने में सक्षम हो सकते हैं - यदि 'गोटो' कीवर्ड लाइन पर पहली चीज़ है। इसमें बैश में 'जाल' के लिए चारों ओर घूमना शामिल होगा, लेकिन सावधान रहें, ऐसे अवतार सभी प्रणालियों पर समान व्यवहार नहीं करते हैं। मैंने कुछ महीने पहले ऐसा एक अनुभव लिखा था, और आपका स्वागत है the results

9

अन्य उपनामों के रूप में उपनाम का उपयोग करने से भी बेहतर, CDPATH चर देखें! यह मूल रूप से PATH कार्यक्षमता के बराबर है, लेकिन सीडी कमांड पर लागू किया गया है।

उदाहरण के लिए, अगर मैं परिभाषित मेरी CDPATH$CDPATH:${HOME}/subdir के रूप में, और ~/subdir एक और निर्देशिका, subsubdir होता है, तो मैं बस पर अमल कर सकते हैं:

cd subsubdir 

किसी भी निर्देशिका से, और अपेक्षा के अनुरूप पथ नेविगेट।

http://www.caliban.org/bash/#bashtips

, CDPATH चर सेट करने के लिए अपने .bashrc के लिए एक लाइन जोड़ने के लिए, इस तरह के

export CDPATH=$CDPATH:${HOME}/subdir 
+0

+1 थी ...कुछ मैं अपने बच्चों को सिखाने की कोशिश कर रहा हूं, जो सोचते हैं कि _everything_ एक हथौड़ा है। –

+0

इसके अलावा, यदि आप अपनी संवेदना को महत्व देते हैं, तो सुनिश्चित करें कि सीडीपीएटीएच के मूल्य में पहला अक्षर ':' है, ताकि जब आप 'cd bin' टाइप करें और वर्तमान निर्देशिका में एक बिन निर्देशिका है, तो वह जगह है जहां आप जाते हैं। –

1

मैं एक सदस्य जब मैं इस के लिए नहीं कहा था के रूप में:

यहां कुछ और बारीकियों है (विडंबना यह है कि मेरे अज्ञात लॉगिन प्रश्न में मेरे आधिकारिक लॉगिन प्रश्नों की तुलना में अधिक फ्लेयर है), इसलिए मैं इसे अभी बंद नहीं कर सकता - लेकिन- रेमो डी। एट अल। जवाब वह होगा जिसने हमें आवश्यक समाधान समाधान का नेतृत्व किया। यदि मोड शक्तियों वाला कोई भी व्यक्ति इस & को बंद कर सकता है तो स्वीकृत उत्तर के रूप में, मैं इसे अपनाना चाहता हूं।