मैं अपनी वर्तमान निर्देशिका को बदले बिना किसी फ़ोल्डर में कमांड कैसे चला सकता हूं?


18

हो सकता है कि यह आपके लिए अजीब लगे, लेकिन मैं शेल में करंट फोल्डर को बदले बिना किसी विशिष्ट फ़ोल्डर में कमांड चलाना चाहता हूं। उदाहरण - यह वही है जो मैं आमतौर पर करता हूं:

~$ cd .folder
~/.folder$ command --key
~/.folder$ cd ..
~$ another_command --key

हालाँकि मैं ऐसा कुछ चाहता हूँ:

~$ .folder command --key
~$ another_command --key

क्या यह संभव है?


क्या तुम नहीं कर सकते ~/.folder/command --key? क्या commandआपके वर्तमान निर्देशिका की आवश्यकता है ~/.folder?
ग्लेन जैकमैन

जवाबों:


46

यदि आप दूसरे से बचना चाहते हैं तो आप cdउपयोग कर सकते हैं

(cd .folder && command --key)
another_command --key

बहुत जल्दी जवाब! मैं भी इसे स्वीकार नहीं कर सकता क्योंकि प्रणाली मुझे अनुमति नहीं देती है))
तैमूर फैज़्रखमानोव

1
जादू कोष्ठक! वह कैसे काम करता है? +1
सटीक

कोष्ठक के भीतर कमांड एक नई शेल प्रक्रिया में चलाए जाते हैं ताकि निर्देशिका को बदलते हुए, कोष्ठक के अंदर पर्यावरण चर आदि स्थापित करने से अन्य कमांड चलाने वाले पैरेंट शेल को प्रभावित न करें।
फ्लोरियन डिस्च

9
मैं बदल देंगे ;करने के लिए &&अच्छा उपाय। यदि cd विफल रहता है (जैसे कि निर्देशिका नाम टाइप करने के कारण), तो आप संभवतः कमांड चलाना नहीं चाहते हैं।
जिरह २४'१४ को

@ जिरह की टिप्पणी के लिए +1। यह वास्तव में एक महत्वपूर्ण बिंदु है। ओपी, क्या आप संपादन पर विचार करेंगे?
jaybee

8

बिना cd... एक बार भी नहीं। मुझे दो तरीके मिले:

# Save where you are and cd to other dir
pushd .folder
command --key
# Get back where you were at the beginning.
popd
another_command --key

और दूसरा:

find . -maxdepth 1 -type d -name ".folder" -execdir command --key \;
another_command --key

1

विशिष्ट निर्देशिका में कमांड चलाने के लिए एक साधारण बैश फ़ंक्शन:

# Run a command in specific directory
run_within_dir() {
    target_dir="$1"
    previous_dir=$(pwd)
    shift
    cd $target_dir && "$@"
    cd $previous_dir
}

उपयोग:

$ cd ~
$ run_within_dir /tmp ls -l  # change into `/tmp` dir before running `ls -al`
$ pwd  # still at home dir

0

मुझे इसे बाश-मुक्त तरीके से करने की आवश्यकता थी, और आश्चर्य था कि कोई उपयोगिता नहीं है (समान है env(1)या sudo(1)जो संशोधित कार्यशील निर्देशिका में एक कमांड चलाता है। इसलिए, मैंने एक सरल सी प्रोग्राम लिखा है जो यह करता है:

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

char ENV_PATH[8192] = "PWD=";

int main(int argc, char** argv) {
    if(argc < 3) {
        fprintf(stderr, "Usage: in <dir> <cmd> [<args>...]\n");
        return 1;
    }

    if(chdir(argv[1])) {
        fprintf(stderr, "Error setting working directory to \"%s\"\n", argv[1]);
        return 2;
    }

    if(!getcwd(ENV_PATH + 4, 8192-4)) {
        fprintf(stderr, "Error getting the full path to the working directory \"%s\"\n", argv[1]);
        return 3;
    }

    if(putenv(ENV_PATH)) {
        fprintf(stderr, "Error setting the environment variable \"%s\"\n", ENV_PATH);
        return 4;
    }

    execvp(argv[2], argv+2);
}

उपयोग इस प्रकार है:

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