Come posso eseguire il comando in una cartella senza modificare la mia directory corrente in essa?


18

può sembrare strano per te, ma voglio eseguire il comando in una cartella specifica senza cambiare la cartella corrente nella shell. Esempio: questo è quello che faccio di solito:

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

Anche se voglio qualcosa del genere:

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

È possibile?


Non puoi farlo ~/.folder/command --key? Condivide la commandrichiede la directory corrente di essere ~/.folder?
Glenn Jackman,

Risposte:


45

Se vuoi evitare il secondo cd, puoi usarlo

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

Risposta molto veloce! Non riesco nemmeno ad accettarlo perché il sistema non me lo consente))
Timur Fayzrakhmanov,

1
parentesi magica! come funziona? +1
preciso il

I comandi all'interno della parentesi vengono eseguiti in un nuovo processo della shell, pertanto la modifica della directory, l'impostazione delle variabili di ambiente ecc. All'interno della parentesi non influisce sulla shell principale che esegue gli altri comandi.
Florian Diesch,

8
Cambierei la ;a &&per buona misura. Se il cd fallisce (es. Perché hai digitato il nome della directory), probabilmente non vuoi eseguire il comando.
geirha,

+1 per il commento di @ geirha. È un punto davvero importante. OP, prenderesti in considerazione la modifica?
Jaybee,

8

Senza cd... Nemmeno una volta. Ho trovato due modi:

# 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

e secondo:

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

1

Una semplice funzione bash per eseguire un comando in una directory specifica:

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

Uso:

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

0

Avevo bisogno di farlo in un modo bash-free, e sono rimasto sorpreso dal fatto che non esiste alcuna utilità (simile env(1)o sudo(1)che esegue un comando in una directory di lavoro modificata. Quindi, ho scritto un semplice programma C che lo fa:

#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);
}

L'utilizzo è così:

$ in /path/to/directory command --key
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.