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


351

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

例如,我有一个二进制文件helloworld,可hello-world.txt当前目录中创建该文件。

该文件在目录内/a

目前,我在目录中/b。我想开始运行程序,../a/helloworldhello-world.txt在第三个目录中找到某个位置/c


5
我发现了一种困难的方式,su可以在运行任何-c命令之前将工作目录重置为您指定的用户的主目录。这对我很有帮助。
Patrick M

Answers:


560

像这样调用程序:

(cd /c; /a/helloworld)

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

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

(cd /c && /a/helloworld)

减少内存使用量:为了避免在hello world执行期间子外壳浪费内存,请helloworld通过exec 调用:

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

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


1
有什么方法可以将参数传递给此shell?如$ 1和$ 2?
finiteloop

2
@segfault:子外壳程序可以完全访问周围的范围。
David Schmitt

好像它还是临时在该目录中,不是吗?
dhein

1
您可以通过执行$ *,$ @或“ $ @”传递所有参数(如果您希望参数遵守双引号)
Marcel Valdez Orozco

1
如果我将此行添加到/etc/rc.d/rc.local,它将起作用吗?
Pratik Patil '18


25

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

(pushd SOME_PATH && run_stuff; popd)

演示:

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

1
萨希尔(Sahil)在下面提出了类似的建议。如果命令失败,它将不起作用。考虑pushd SOME_PATH && run_stuff && popd-如果run_stuff失败,则不会执行popd。
安东·丹尼科

延迟回复,取决于bash文件的设置。即使在失败的命令之后(与使用&&不同),Bash仍可以继续执行命令,但是可以将Bash设置为不在set -e文件中使用它,然后失败popd
罗兰

8
不过,我认为pushd "${SOME_PATH}" && run_stuff; popd它比当前答案更好,因为push / popd语义是专门为这种情况而设计的,即进入某个目录然后返回到原始目录。
Marcel Valdez Orozco

它如何定义为别名,我需要传递参数吗?
DrB

我认为您需要编写一个shell脚本,因为您无法在别名中间传递参数,因此您将向该脚本传递执行一系列命令的参数。如果您需要帮助来编写该文档,则应提出一个单独的问题并参考该问题。拥有Shell脚本后,您可以编写别名来调用新脚本。
罗伦(Loren)


11

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

$ cd〜/ b

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


6
+1是正确的,尽管答案只是外围的答案。
David Schmitt,2009年

8

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

cd SOME_PATH && run_some_command ; cd -

4

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

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

这是一个bash shell脚本示例:

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

2

为什么不保持简单

cd SOME_PATH && run_some_command && cd -

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


您写的是@mezhaka,应该考虑到:)
Sahil

1
警告:如果run_some_command失败,cd -将不会执行。
starbeamrainbowlabs


0

如果您想在程序中执行此操作,则可以执行以下操作:

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

  // rest of your program...

}

他想在shell脚本中而不是在C语言中执行此操作。此外,对二进制文件进行子处理将是一个可怕的想法。

-1

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

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

1
这根本不会改变工作目录-我认为您正在回答的问题与提出的问题不同。
Toby Speight

来到这里找到您所回答问题的答案。谢谢!大声笑
kfrncs
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.