可能对您来说似乎很奇怪,但是我想在特定文件夹中运行命令而不更改外壳程序中的当前文件夹。示例-这是我通常要做的:
~$ cd .folder
~/.folder$ command --key
~/.folder$ cd ..
~$ another_command --key
虽然我想要这样的东西:
~$ .folder command --key
~$ another_command --key
可能吗?
可能对您来说似乎很奇怪,但是我想在特定文件夹中运行命令而不更改外壳程序中的当前文件夹。示例-这是我通常要做的:
~$ cd .folder
~/.folder$ command --key
~/.folder$ cd ..
~$ another_command --key
虽然我想要这样的东西:
~$ .folder command --key
~$ another_command --key
可能吗?
Answers:
如果要避免第二秒cd
,可以使用
(cd .folder && command --key)
another_command --key
;
改为&&
。如果cd失败(例如,因为您键入目录名称),则可能不想运行该命令。
没有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
我需要以一种无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
~/.folder/command --key
吗?是否command
要求您当前的目录为~/.folder
?