404

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

例如,我有一个在当前目录helloworld中创建文件的二进制文件。 这个文件在目录里面。hello-world.txt

/a

目前,我在目录中/b。我想开始运行我的程序../a/helloworld并获得hello-world.txt第三个目录中的某个位置/c

4

11 回答 11

637

像这样调用程序:

(cd /c; /a/helloworld)

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

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

(cd /c && /a/helloworld)

减少内存使用:为避免在 hello world 执行时让 subshel​​l 浪费内存,请helloworld通过 exec 调用:

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

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

于 2009-04-24T15:46:04.983 回答
110

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

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

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

于 2009-04-24T16:05:06.733 回答
34

一个不需要 subshel​​l 并且内置于 bash 的选项

(pushd SOME_PATH && run_stuff; popd)

演示:

$ pwd
/home/abhijit
$ pushd /tmp # directory changed
$ pwd
/tmp
$ popd
$ pwd
/home/abhijit
于 2015-07-13T19:28:35.250 回答
20
sh -c 'cd /c && ../a/helloworld'
于 2009-04-24T15:49:37.550 回答
10

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

$ cd ~/b

$ ~/a/helloworld > ~/c/helloworld.txt
于 2009-04-24T17:15:27.123 回答
10

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

cd SOME_PATH && run_some_command ; cd -
于 2016-03-29T08:07:35.327 回答
4

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

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

这是一个 bash shell 脚本示例:

#!/bin/bash
cd /c
/a/helloworld
于 2009-04-24T15:46:04.967 回答
3

为什么不保持简单

cd SOME_PATH && run_some_command && cd -

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

于 2015-01-02T03:27:56.337 回答
2

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

于 2009-04-24T15:40:18.337 回答
-1

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

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

  // rest of your program...

}
于 2009-04-24T16:16:50.183 回答
-3

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

/root/server/user/home/bin/script.sh
于 2017-06-20T10:23:23.757 回答