如何从当前Linux shell运行具有不同工作目录的程序?

How do I run a program with a different working directory from current, from Linux shell?

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

例如,我有一个二进制文件helloworld,它在当前目录中创建文件hello-world.txt。这个文件在目录/a中。目前我在/b号目录。我想启动运行../a/helloworld的程序,把hello-world.txt放在第三个目录/c的某个地方。


这样调用程序:

1
(cd /c; /a/helloworld)

圆括号导致生成子shell。然后,该子shell将其工作目录更改为/c,然后从/a执行helloworld。程序退出后,子shell将终止,并返回到您开始的目录中父shell的提示。

错误处理:为了避免在不更改目录的情况下运行程序,例如,在拼写错误的/c时,使helloworld的执行成为条件:

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

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

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

[感谢乔希和朱利亚诺提出改进这个答案的建议!]


类似于大卫·施密特的回答,加上乔希的建议,但不会让shell进程继续运行:

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

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


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


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

1
(pushd SOME_PATH && run_stuff; popd)

演示:

1
2
3
4
5
6
7
8
$ pwd
/home/abhijit
$ pushd /tmp # directory changed
$ pwd
/tmp
$ popd
$ pwd
/home/abhijit


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

$CD~/B

美元~/a/helloworld>~/c/helloworld.txt


只需将最后一个"&;&;&;"更改为";",无论命令失败或成功,它都将CD返回:

1
cd SOME_PATH && run_some_command ; cd -


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

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

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

1
2
3
#!/bin/bash
cd /c
/a/helloworld

为什么不简单点呢

cd SOME_PATH && run_some_command && cd -

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


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


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

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


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

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <unistd.h>
int main()
{
  if(chdir("/c") < 0 )  
  {
     printf("Failed
");
     return -1 ;
  }

  // rest of your program...

}