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

使用Linux shell,如何从当前工作目录中启动一个具有不同工作目录的程序?

例如,我有一个二进制文件helloworld ,在当前目录下创build文件hello-world.txt 。 该文件位于目录/a 。 目前我在目录/b 我想开始运行我的程序../a/helloworld并在第三个目录/cfindhello-world.txt

像这样调用程序:

 (cd /c; /a/helloworld) 

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

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

 (cd /c && /a/helloworld) 

减less内存使用情况:为了避免hello world执行时子shell的内存浪费,通过exec调用helloworld

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

[感谢Josh和Juliano给出提高这个答案的提示!]

与David Schmitt的答案类似,再加上Josh的build议,但是不会留下一个shell进程:

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

这种方式与通常在shell上运行命令的方式更相似。 要看到实际的区别,你必须从每个解决scheme的另一个shell运行ps ef

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

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

$ cd〜/ b

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

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

 (pushd SOME_PATH && run_stuff; popd) 

演示:

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

一种方法是创build一个封装shell脚本。

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

这是一个bash shell脚本示例:

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

只要把最后一个“&&”改成“;” 无论命令是失败还是成功,它都会回复:

 cd SOME_PATH && run_some_command ; cd - 

如果你总是希望它到/ C,写入文件时使用绝对path。

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

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

为什么不保持简单

cd SOME_PATH && run_some_command && cd -

最后一个'cd'命令将带你回到最后一个pwd目录。 这应该适用于所有* nix系统。

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

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