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

时间:2009-04-24 15:36:23

标签: linux shell environment

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

例如,我有一个二进制文件helloworld,它在当前目录中创建文件hello-world.txt。该文件位于目录/a内。目前我在目录/b中。我想启动运行../a/helloworld的程序并将hello-world.txt放在第三个目录/c中的某个位置。

11 个答案:

答案 0 :(得分:495)

像这样调用程序:

(cd /c; /a/helloworld)

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

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

(cd /c && /a/helloworld)

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

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

[感谢Josh and Juliano提供有关改进此答案的提示!]

答案 1 :(得分:87)

David Schmitt的答案类似,加上Josh的建议,但不会让shell进程运行:

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

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

答案 2 :(得分:18)

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

答案 3 :(得分:18)

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

(pushd SOME_PATH && run_stuff; popd)

演示:

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

答案 4 :(得分:11)

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

$ cd~ / b

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

答案 5 :(得分:5)

只需更改最后一个"&&"进入";"无论命令失败还是成功,它都会回来:

cd SOME_PATH && run_some_command ; cd -

答案 6 :(得分:3)

一种方法是创建一个包装shell脚本。

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

这是一个bash shell脚本示例:

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

答案 7 :(得分:1)

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

答案 8 :(得分:1)

为什么不保持简单

cd SOME_PATH && run_some_command && cd -

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

答案 9 :(得分:0)

如果您想在程序中执行此操作,那么我会执行以下操作:

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

  // rest of your program...

}

答案 10 :(得分:0)

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

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