Geçerli dizinimi buna değiştirmeden bir klasörde nasıl komut çalıştırabilirim?


19

sizin için garip görünebilir, ancak kabuktaki geçerli klasörü değiştirmeden belirli bir klasörde komut çalıştırmak istiyorum. Örnek - genellikle yaptığım budur:

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

Ben böyle bir şey istiyorum rağmen:

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

Mümkün mü?


Yapamaz mısın ~/.folder/command --key? Does commandolmak için geçerli dizini gerektirir ~/.folder?
glenn jackman

Yanıtlar:


47

Eğer ikinci önlemek cdistiyorsanız kullanabilirsiniz

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

Çok hızlı cevap! Kabul edemiyorum çünkü sistem bana izin vermiyor))
Timur Fayzrakhmanov

1
sihirli parantez! bu nasıl çalışıyor? +1
kesin

Parantez içindeki komutlar yeni bir kabuk işleminde çalıştırılır, böylece parantez içindeki dizini değiştirmek, ortam değişkenlerini ayarlamak vb. Diğer komutları çalıştıran üst kabuğu etkilemez.
Florian Diesch

9
Ben değiştirmek istiyorum ;To &&iyi ölçmek için. Cd başarısız olursa (örneğin, dizin adını yazdığınız için), muhtemelen komutu çalıştırmak istemezsiniz.
geirha

@ Geirha adlı kullanıcının yorumu için +1. Bu gerçekten önemli bir nokta. OP, düzenlemeyi düşünür müsün?
jaybee

8

Olmadan cd... Bir kez bile değil. İki yol buldum:

# 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

ve ikinci:

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

1

Belirli bir dizinde komut çalıştırmak için basit bir bash işlevi:

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

Kullanımı:

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

0

Bunu bash içermeyen bir şekilde yapmaya ihtiyacım vardı ve hiçbir yardımcı programın ( değiştirilmiş bir çalışma dizinine benzer env(1)veya sudo(1)bir komutu çalıştıran) şaşırdı . Bu yüzden, bunu yapan basit bir C programı yazdım:

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

Kullanımı şöyle:

$ in /path/to/directory command --key
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.