如何在不更改当前目录的情况下在文件夹中运行命令?


18

可能对您来说似乎很奇怪,但是我想在特定文件夹中运行命令而不更改外壳程序中的当前文件夹。示例-这是我通常要做的:

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

虽然我想要这样的东西:

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

可能吗?


你不能~/.folder/command --key吗?是否command要求您当前的目录为~/.folder
glenn jackman 2014年

Answers:


46

如果要避免第二秒cd,可以使用

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

很快的答案!我什至无法接受,因为系统不允许我))
Timur Fayzrakhmanov 2014年

1
魔术括号!这是如何运作的?+1
精确

括号内的命令在新的Shell进程中运行,因此更改括号内的目录,设置环境变量等不会影响运行其他命令的父Shell。
Florian Diesch 2014年

9
我会适当地将更;改为&&。如果cd失败(例如,因为您键入目录名称),则可能不想运行该命令。
盖尔哈2014年

+1 @geirha的评论。这是非常重要的一点。OP,您会考虑编辑吗?
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

一个简单的bash函数,用于在特定目录中运行命令:

# 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

我需要以一种无bash的方式执行此操作,但感到惊讶的是,没有实用程序(类似于env(1)sudo(1)在修改后的工作目录中运行命令的实用程序。因此,我编写了一个简单的C程序来执行此操作:

#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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.