क्या एक कार्यक्रम शुरू करते समय वर्तमान कार्य निर्देशिका को सेट करने के लिए POSIX (या कम से कम एक लोकप्रिय) उपयोगिता है?


20

हमारे पास उस कमांड के वातावरण को संशोधित करने के लिए env (1) है जिसे हम चलाना चाहते हैं (उदाहरण के लिए env MANPAGER=more man dtrace)। क्या ऐसा ही कुछ है लेकिन निर्देशिका को संशोधित करने के लिए जिसे कमांड शुरू किया जा रहा है?

आदर्श रूप में, मैं इसे इस तरह देखना चाहूंगा:

theMagicCommand /new/cwd myProgram

इस तरह से यह अन्य env (1)-जैसे कमांड के साथ "जंजीर" हो सकता है, जैसे,

daemon -p /tmp/pid env VAR=value theMagicCommand /new/cwd myProgram

अब तक मैं निम्नलिखित समाधान के बारे में सोच सकता हूं, जो दुर्भाग्य से env (1) के समान इंटरफ़ेस नहीं है :

cd /new/cwd && myProgram

इसके अलावा, मैं बस इस तरह से एक सरल शेल स्क्रिप्ट बना सकता हूं:

#! /bin/sh -
cd "${1:?Missing the new working directory}" || exit 1
shift
exec "${@:?Missing the command to run}"

लेकिन मैं कुछ ऐसा देख रहा हूँ जो पहले से मौजूद है (कम से कम macOS और FreeBSD पर)।

myProgramयह जरूरी नहीं है कि एक डेस्कटॉप एप्लिकेशन (जिस स्थिति में मैं .desktop फ़ाइल में पथ कुंजी का उपयोग कर सकता हूं )।


6
cd /new/cwd && env VAR=value myProgramअपने समीरा से क्यों नहीं मिलता?
jpaugh

यह पहले से ही सवाल में है, जहां एम। पिओत्रोस्की ने समझाया कि यह एक ही इंटरफ़ेस नहीं है env। को देखो env। की तुलना में यह करने के लिए rtprio, idprio, numactl, jexec, chrt, और वास्तव में उपकरण सेट में आदेश के जवाब में बताया गया। एक पैटर्न है, और यह चेन लोडिंग है।
JdeBP

3
"इंटरफ़ेस" से आपका क्या तात्पर्य है? और उपयोग क्यों नहीं (cd the/cwd; cmd)?
कोनराड रुडोल्फ

2
@KonradRudolph उदाहरण के लिए, आप आसानी से (cd the/cwd; cmd)श (1) को लपेटे बिना env (1) पास नहीं कर सकते ।
माटुस्स पिओत्रोवस्की

जवाबों:


19

AFAIK, POSIX टूल चेस्ट में ऐसी कोई समर्पित उपयोगिता नहीं है। लेकिन shअपनी shस्क्रिप्ट में कमांड चलाने से पहले एक वातावरण (cwd, लिमिट्स, stdout / in /reat, umask ...) सेट करना आम है ।

लेकिन आपको उस स्क्रिप्ट को किसी फ़ाइल में लिखने की ज़रूरत नहीं है, आप इसे केवल इनलाइन कर सकते हैं:

sh -c 'CDPATH= cd -P -- "$1" && shift && exec "$@"' sh /some/dir cmd args

(यह मानते हुए कि निर्देशिका नहीं है -)। जोड़ना CDPATH=(मामले में पर्यावरण में एक है) और -Pइसके लिए एक सीधे की तरह अधिक व्यवहार करना chdir()

वैकल्पिक रूप से, आप इस्तेमाल कर सकते हैं perlजिसका chdir()एक सीधी करता chdir()बॉक्स से बाहर।

perl -e 'chdir(shift@ARGV) or die "chdir: $!"; exec @ARGV or die "exec: $!"
         ' /some/dir cmd args

अरे हां। यह मेरे प्रश्न में शामिल स्क्रिप्ट का एक बहुत ही आसान बदलाव है। मुझे डर था कि मैं जिस उपयोगिता की तलाश कर रहा हूं वह मौजूद नहीं है क्योंकि इसकी कार्यक्षमता पहले से ही अपेक्षाकृत कम श (1) ऑनलाइनर के साथ उपलब्ध है।
मातुज़ Piotrowski

8
यदि आप पहले से ही चल रहे हैं sh, तो आप भी कर सकते हैं (cd /wherever && exec /my/command)()परोक्ष लिपटे आदेशों को चलाने के लिए एक subshell खोलता है, और निश्चित रूप से, execजल्दी से के रूप में के रूप में अतिरिक्त खोल प्रक्रिया से छुटकारा हो जाता /my/commandचल रहा शुरू होता है।
jpaugh

2
यह अब हटाए गए उत्तर में सुझाया गया था। प्रश्नकर्ता ने समझाया कि यह कोई जवाब नहीं था कि xe ने क्या पूछा।
जेडीबीपी

15

टूलसेट्स दुनिया में इस्तेमाल किए गए उपकरण, और अन्य जगहों पर, इसके अलावा और भी बहुत कुछ है; कई वर्षों से पड़ा है; और व्यापक रूप से उपलब्ध हैं।

  • वेन मार्शल की प्रति है runtool:

    runtool -c / new / cwd myProgram
  • लॉरेंट बर्कोट के निष्‍पादन में है cd:

    सीडी / नई / सीडब्ल्यूडी मायप्रोग्राम
  • मेरे nosh टूलसेट में है chdir:

    chdir / new / cwd मायप्रोग्राम

ये सभी श्रृंखला-लोडिंग उपकरण हैं, जिन्हें बिल्कुल इन प्रकार की श्रृंखलाओं में उपयोग करने के लिए डिज़ाइन किया गया है। अन्य प्रयोजनों के लिए इन टूलकिट में श्रृंखला-लोडिंग टूल का एक विस्तृत चयन है।

आगे की पढाई


11

इतना लोकप्रिय कार्यक्रम है। यह कहा जाता है ... पकड़ अपनी कुर्सी पर ... drumroll ... env। GNU संस्करण, संस्करण 8.28 के बाद से, POSIX नहीं, के पास -Cविकल्प है जो आपको निर्देशिका को उसी तरह सेट करने देता है जैसे आपको आवश्यकता होती है:

    नाम
           env - एक प्रोग्राम को संशोधित वातावरण में चलाएं

    SYNOPSIS
           env [विकल्प] ... [-] [NAME = VALUE] ... [COMMAND [ARG] ...]

    विवरण
           प्रत्येक NAME को वातावरण में VALUE पर सेट करें और COMMAND चलाएँ।

           छोटे विकल्पों के लिए लंबे विकल्पों के लिए अनिवार्य तर्क अनिवार्य हैं।

           -आई , --इग्नोर-एनवायरनमेंट
                  खाली वातावरण से शुरुआत करें

           -0 , --null
                  एनयूएल के साथ प्रत्येक आउटपुट लाइन को समाप्त करें, न्यूलाइन नहीं

           -u , --unset = NAME
                  पर्यावरण से चर निकालें

           -C , --chdir = DIR
                   वर्किंग डायरेक्टरी को DIR में बदलता है

           -help इस सहायता को प्रदर्शित करें और बाहर निकलें

           --version
                  आउटपुट संस्करण की जानकारी और बाहर निकलें

           एक मात्र - तात्पर्य -i । यदि कोई नहीं है, तो परिणामी वातावरण को प्रिंट करें।


कूल, हालाँकि यह मैकओएस और फ्रीबीएसडी पर उपलब्ध नहीं है।
माटूस पिओत्रोस्की

1

कुछ कार्यक्रमों में इसके लिए एक विकल्प होता है, जैसे Git:

-C <path>

वर्तमान कार्य निर्देशिका के बजाय जैसे gitशुरू किया गया था, वैसे ही चलाएं <path>

और बनाओ:

-C dir, --directory=dir

dirMakefiles पढ़ने या कुछ और करने से पहले निर्देशिका में बदलें ।

और श्रेणी:

-C, --directory=DIR

DIRकिसी भी ऑपरेशन को करने से पहले बदलें । यह विकल्प ऑर्डर-संवेदी है, अर्थात यह उन सभी विकल्पों को प्रभावित करता है जो अनुसरण करते हैं।


हाँ। हालांकि मेरा सवाल यह है कि अगर myProgramऐसा कोई विकल्प प्रदान नहीं करता है ... आपके योगदान के लिए धन्यवाद, लेकिन मुझे डर है कि यह मेरे सवाल का जवाब नहीं देता है।
माटुस्स पिओत्रोस्की
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.