Làm thế nào tôi có thể chạy lệnh trong một thư mục mà không thay đổi thư mục hiện tại của tôi với nó?


18

có thể nó có vẻ lạ đối với bạn, nhưng tôi muốn chạy lệnh trong một thư mục cụ thể mà không thay đổi thư mục hiện tại trong shell. Ví dụ - đây là những gì tôi thường làm:

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

Mặc dù tôi muốn một cái gì đó như thế này:

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

Có thể không?


Bạn không thể làm gì ~/.folder/command --key? Có commandyêu cầu thư mục hiện tại của bạn phải ~/.folderkhông?
glenn jackman

Câu trả lời:


44

Nếu bạn muốn tránh thứ hai, cdbạn có thể sử dụng

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

Câu trả lời rất nhanh! Tôi thậm chí không thể chấp nhận vì hệ thống không cho phép tôi))
Timur Fayzrakhmanov

1
dấu ngoặc đơn ma thuật! nó hoạt động thế nào +1
chính xác

Các lệnh trong ngoặc đơn được chạy trong một quy trình shell mới để thay đổi thư mục, đặt các biến môi trường, v.v. bên trong dấu ngoặc đơn không ảnh hưởng đến shell cha chạy các lệnh khác.
Florian Diesch

7
Tôi muốn thay đổi ;để &&có biện pháp tốt. Nếu cd không thành công (ví dụ vì bạn đánh máy tên thư mục), có lẽ bạn không muốn chạy lệnh.
geirha

+1 cho nhận xét của @ geirha. Đó là một điểm thực sự quan trọng. OP, bạn sẽ xem xét chỉnh sửa?
jaybee

8

Không có cd... Thậm chí không chỉ một lần. Tôi tìm thấy hai cách:

# 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

và thứ hai:

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

1

Một hàm bash đơn giản để chạy lệnh trong thư mục cụ thể:

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

Sử dụng:

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

0

Tôi có nhu cầu thực hiện việc này theo cách không có bash, và thật ngạc nhiên là không có tiện ích nào (tương tự env(1)hoặc sudo(1)chạy lệnh trong thư mục làm việc đã sửa đổi. Vì vậy, tôi đã viết một chương trình C đơn giản thực hiện:

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

Cách sử dụng là như thế này:

$ in /path/to/directory command --key
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.