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

Ant*_*yko 327 linux shell environment

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

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

Dav*_*itt 526

像这样调用程序:

(cd /c; /a/helloworld)
Run Code Online (Sandbox Code Playgroud)

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

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

(cd /c && /a/helloworld)
Run Code Online (Sandbox Code Playgroud)

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

(cd /c && exec /a/helloworld)
Run Code Online (Sandbox Code Playgroud)

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

  • 整个“()”构造将包含最后一个命令的退出代码。您可以直接通过链接或通过检查“$?”来检查。 (3认同)
  • 有什么方法可以将参数传递给这个shell?就像 1 美元和 2 美元? (2认同)
  • @segfault:子shell可以完全访问周围的范围. (2认同)
  • 您可以通过 $*、$@ 或 "$@" 传递所有参数(如果您希望参数尊重双引号) (2认同)

Jul*_*ano 92

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

(cd /c && exec /a/helloworld)
Run Code Online (Sandbox Code Playgroud)

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

  • 只是在这里说一下 - `exec` 用给定的命令替换 shell 进程,而不创建新进程。 (4认同)

Lor*_*ren 22

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

(pushd SOME_PATH && run_stuff; popd)
Run Code Online (Sandbox Code Playgroud)

演示:

$ pwd
/home/abhijit
$ pushd /tmp # directory changed
$ pwd
/tmp
$ popd
$ pwd
/home/abhijit
Run Code Online (Sandbox Code Playgroud)

  • 不过,我认为`pushd'$ {SOME_PATH}"&& run_stuff; popd`比当前的答案更好,因为pushd/popd语义是专为这种进入某个目录然后回到原始目录的情况而设计的. (6认同)
  • Sahil 在下面提出了类似的建议。如果命令失败则不起作用。考虑 `pushd SOME_PATH && run_stuff && popd` ——如果 run_stuff 失败,则 popd 将不会被执行。 (2认同)

mih*_*ihi 18

sh -c 'cd /c && ../a/helloworld'
Run Code Online (Sandbox Code Playgroud)

  • 哇,幸运的是,他们甚至让你在监狱中使用电脑 (17认同)

小智 11

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

$ cd~/b

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

  • +1是正确的,虽然答案只是外围答案. (6认同)

小智 8

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

cd SOME_PATH && run_some_command ; cd -
Run Code Online (Sandbox Code Playgroud)


小智 6

为什么不保持简单呢

cd SOME_PATH && run_some_command && cd -

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

  • 警告:如果“run_some_command”失败,“cd -”将不会被执行。 (3认同)