我如何运行一个不同的工作目录从当前的程序,从Linux shell?

使用Linux shell,如何启动与当前工作目录不同的工作目录的程序?

例如,我有一个二进制文件helloworld,它在当前目录. xml文件中创建了文件hello-world.txt。 < br > < br > 该文件位于目录/a内。< / p >

目前,我在目录/b。我想启动运行../a/helloworld的程序,并在第三个目录/c中获取hello-world.txt

307288 次浏览

如果您总是希望它到/C,那么在写入文件时使用绝对路径。

一种方法是创建包装器外壳脚本。

shell脚本将当前目录更改为/c,然后运行/a/helloworld。shell脚本退出后,当前目录将恢复到/b。

下面是一个bash shell脚本示例:

#!/bin/bash
cd /c
/a/helloworld

像这样调用程序:

(cd /c; /a/helloworld)

括号会生成一个子shell。然后这个子shell将其工作目录更改为/c,然后从/a执行helloworld。程序退出后,子shell终止,将您返回到父shell的提示符,在您启动的目录中。

为了避免在没有改变目录的情况下运行程序,例如在拼写错误的/c时,将helloworld的执行设为条件:

(cd /c && /a/helloworld)

为了避免在hello world执行时浪费子shell的内存,可以通过exec调用helloworld:

(cd /c && exec /a/helloworld)

[感谢乔什和茱莉亚诺为改进这个答案提供建议!]]

sh -c 'cd /c && ../a/helloworld'

类似于大卫•施密特的答案,加上Josh的建议,但不会让shell进程运行:

(cd /c && exec /a/helloworld)

这种方式更类似于您通常在shell上运行命令的方式。为了看到实际的区别,你必须在每个解决方案的另一个shell中运行ps ef

如果你想在你的程序中执行这个,那么我会这样做:

#include <unistd.h>
int main()
{
if(chdir("/c") < 0 )
{
printf("Failed\n");
return -1 ;
}


// rest of your program...


}

我一直认为UNIX工具应该编写为过滤器,从stdin读取输入,并将输出写入stdout。如果可能的话,您可以更改helloworld二进制文件,将文本文件的内容写入标准输出,而不是特定的文件。这样,您就可以使用shell在任何地方写入文件。

$ cd ~/b


$ ~/a/helloworld > ~/c/helloworld.txt

为什么不简单点呢

cd SOME_PATH && run_some_command && cd -

最后一个“cd”命令将带您回到最后一个PWD目录。这应该适用于所有*nix系统。

一个不需要子shell并且内置于bash的选项

(pushd SOME_PATH && run_stuff; popd)

演示:

$ pwd
/home/abhijit
$ pushd /tmp # directory changed
$ pwd
/tmp
$ popd
$ pwd
/home/abhijit

只要将最后一个“&&”改为“;”,无论命令失败或成功,它都将cd返回:

cd SOME_PATH && run_some_command ; cd -

从当前目录提供到脚本目录执行命令的完整路径

/root/server/user/home/bin/script.sh