linux - ययन - रूपांतरित चट्टान के उदाहरण




मैं लिनक्स शैल से वर्तमान में एक अलग कार्यशील निर्देशिका के साथ प्रोग्राम कैसे चला सकता हूं? (8)

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

उदाहरण के लिए, मेरे पास एक बाइनरी फ़ाइल helloworld है जो वर्तमान निर्देशिका में फ़ाइल hello-world.txt बनाता है। यह फ़ाइल निर्देशिका /a अंदर /a । वर्तमान में मैं निर्देशिका में हूँ /b । मैं अपना प्रोग्राम चालू करना चाहता हूं ../a/helloworld और hello-world.txt कहीं तीसरी निर्देशिका /c


इस तरह के कार्यक्रम को कॉल करें:

(cd /c; /a/helloworld)

कोष्ठक एक उप-खोल पैदा करने का कारण बनता है। यह उप-खोल तब अपनी कार्यशील निर्देशिका को /c , फिर /a से helloworld निष्पादित करता /a । कार्यक्रम से बाहर निकलने के बाद, उप-शेल समाप्त हो जाता है, जो आपको प्रारंभिक निर्देशिका में, पैरेंट खोल के आपके संकेत पर लौटाता है।

त्रुटि प्रबंधन: निर्देशिका को बदलने के बिना प्रोग्राम चलाने से बचने के लिए, उदाहरण के लिए जब गलत वर्तनी /c , helloworld सशर्त निष्पादन करें:

(cd /c && /a/helloworld)

स्मृति उपयोग को कम करना: हैलो वर्ल्ड निष्पादित करते समय सबहेल अपशिष्ट मेमोरी होने से बचने के लिए, helloworld को exec के माध्यम से कॉल करें:

(cd /c && exec /a/helloworld)

[इस जवाब में सुधार करने के लिए सुझाव देने के लिए जोश और जूलियानो को धन्यवाद!]


इसे आसान क्यों न रखें

cd SOME_PATH && run_some_command && cd -

अंतिम 'सीडी' कमांड आपको पिछली पीडब्ल्यूडी निर्देशिका में ले जाएगा। यह सभी * निक्स सिस्टम पर काम करना चाहिए।


ऐसा करने का एक तरीका एक रैपर शैल स्क्रिप्ट बनाना है।

शेल स्क्रिप्ट वर्तमान निर्देशिका को / c में बदल देगी, फिर रन / ए / helloworld चलाएं। एक बार खोल स्क्रिप्ट निकल जाने के बाद, वर्तमान निर्देशिका वापस / b पर वापस आती है।

यहां एक बैश खोल स्क्रिप्ट उदाहरण है:

#!/bin/bash
cd /c
/a/helloworld

बस अंतिम "&&" को ";" में बदलें और यदि आदेश विफल रहता है या सफल होता है तो यह सीडी वापस आ जाएगा:

cd SOME_PATH && run_some_command ; cd -

यदि आप इसे अपने प्रोग्राम के अंदर करना चाहते हैं तो मैं कुछ ऐसा करूंगा:

#include <unistd.h>
int main()
{
  if(chdir("/c") < 0 )  
  {
     printf("Failed\n");
     return -1 ;
  }

  // rest of your program...

}

यदि आप हमेशा इसे / सी पर जाना चाहते हैं, तो फ़ाइल लिखते समय एक पूर्ण पथ का उपयोग करें।


डेविड श्मिट के जवाब के समान, जोश के सुझाव के साथ, लेकिन एक खोल प्रक्रिया चलाना नहीं छोड़ता है:

(cd /c && exec /a/helloworld)

इस तरह आप आमतौर पर शेल पर कमांड कैसे चलाते हैं इसके समान ही है। व्यावहारिक अंतर देखने के लिए, आपको प्रत्येक समाधान के साथ एक और खोल से ps ef चलाने के लिए है।


sh -c 'cd /c && ../a/helloworld'




environment