माणिक स्क्रिप्ट के अंदर डायरेक्टरी बदलने के लिए?


100

मैं एक नई रेल एप्लिकेशन बनाना चाहता हूं और उस एप्लिकेशन के लिए रेल सर्वर को एक रूबी स्क्रिप्ट से सब कुछ फायर करना चाहता हूं।

मेरा कोड इस तरह दिखता है:

#!/usr/bin/env ruby
system "rails new my_app"
system "cd my_app"
system "rails server &"

हालाँकि, "रेल सर्वर" चलाने के दौरान मार्ग my_app फ़ोल्डर में नहीं है, बल्कि पैरेंट फ़ोल्डर में है।

क्या स्क्रिप्ट के अंदर डायरेक्टरी बदलने का कोई तरीका है ताकि मैं उस नए एप्लिकेशन के लिए "रेल सर्वर", "रैक के बारे में" और "रेक डीबी: माइग्रेट" चला सकूं?

सुझावों के आसपास सभी काम की सराहना की जाएगी।


6
ध्यान दें कि सबसे अच्छा उत्तर एक चिह्नित नहीं है। इस पृष्ठ के निचले भाग पर पढ़ते रहें।
ज़ेन

जवाबों:


104

उपयोग करें Dir.chdir:

Dir.chdir "my_app"

22
ध्यान रखें कि आपके पूरे कार्यक्रम के दौरान इसके दुष्प्रभाव हो सकते हैं। संभावित बगों से बचने के लिए अन्य उत्तर देखें।
19 दिसंबर को Leopd

यह एक बुरा जवाब है। यह समस्या को हल करता है, लेकिन आपको इसके बाद कोड में समस्या हो सकती है। कृपया "सबसे अच्छा जवाब" को एक और एक (अधिक upvotes के साथ) बदलने के लिए विचार करें
Ezh

366

उनकी बात मत सुनो, Dir.chdir("dir")शायद गलत काम करेंगे। आप इस कार्यक्रम के बाकी हिस्सों को प्रभावित किए बिना, किसी विशेष संदर्भ में बदलाव को सीमित करना चाहते हैं।

#!/usr/bin/env ruby
system "rails new my_app"
Dir.chdir("my_app") do
  system "rails server &"
end
# back where we were, even with exception or whatever

एक थ्रेडेड एप्लिकेशन में ब्लॉक का उपयोग करने में बहुत सावधान रहें जैसे कि साइडकीक का उपयोग करता है। जस्ट एंड
एफवाईआई

@jryancanty यदि मैं एक धागा बनाते हैं, और इस उत्तर में निर्देशिका को बदलते हैं, तो "साइड इफेक्ट्स" क्या हैं? (मैं साइडकिक, सिर्फ Threadक्लास का उपयोग नहीं करूंगा )
वनब्री

1
मैं इस बात के लिए भी उत्सुक हूं कि दुष्प्रभाव क्या हैं (या तो विधि का उपयोग करके)। यदि आप कार्यशील निर्देशिका को बदलते हैं, तो आप इसे हमेशा वापस, सही बदल सकते हैं?
stevec

किसी भी समय आप नहीं कर सकते के बारे में पता नहीं है ... बस करते हैं original_directory = Dir::pwd, तो बाद में चर की तरह याद करते हैं:Dir::chdir(original_directory)
Poyda

11

प्रणाली का समर्थन करता है: chdir तर्क जो आपको इसकी कार्यशील निर्देशिका निर्दिष्ट करने की अनुमति देता है:

system("echo Test; pwd", chdir: '/tmp')

आउटपुट '/ tmp'


3

Dir.chdirस्क्रिप्ट के लिए कार्यशील निर्देशिका को बदलने के लिए उपयोग करें ।



1

आप ऐसा क्यों नहीं कर सकते:

#!/usr/bin/env ruby
system 'rails new myapp && cd myapp && rails server &'

1
जब सिस्टम कमांड विफल हो जाता है, तो यह निदान करना कठिन होगा कि क्या गलत हुआ - क्या रेल एप्लिकेशन विफल हो गया, क्या सीडी विफल हुआ, या क्या रेल सर्वर विफल हो गया?
ablarg

1

निम्न पंक्तियों में एक ही आउटपुट है:

puts Dir.chdir("/tmp") { IO.popen("ls -la") { |io| io.read } } 

puts IO.popen(["ls", "-la", "/tmp"]).read

puts IO.popen("ls -la /tmp").read

# drwxrwxrwt 25 root       root       16384 июля  23 01:17 .
# drwxr-xr-x 22 root       root        4096 июля  22 13:36 ..
# drwxrwxr-x 12 itsnikolay itsnikolay  4096 июля  19 17:14 app_template
# drwx------  2 itsnikolay itsnikolay  4096 июля  21 15:04 .com.google.Chrome.dThb8f
# drwx------  2 itsnikolay itsnikolay  4096 июля  18 20:55 .com.google.Chrome.FGDBGc

भी आप रेल चला सकते हैं और एक आवेदन बना सकते हैं (यह आरएसपीईएस परीक्षण और आदि में सहायक हो सकता है):

IO.popen("cd /tmp/ && rails new test_app").read

और कभी भी आप एक रेल सर्वर चला सकते हैं;)

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