Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用与当前Linux shell不同的工作目录运行程序?_Linux_Shell_Environment - Fatal编程技术网

如何使用与当前Linux shell不同的工作目录运行程序?

如何使用与当前Linux shell不同的工作目录运行程序?,linux,shell,environment,Linux,Shell,Environment,使用Linux shell,如何使用与当前工作目录不同的工作目录启动程序 例如,我有一个二进制文件helloworld,它在当前目录中创建文件helloworld.txt。 此文件位于目录/a中 目前,我在目录/b中。我想启动运行。/a/helloworld的程序,并在第三个目录/c的某个地方获取helloworld.txt,如果您总是希望它转到/c,那么在编写文件时使用绝对路径。一种方法是创建一个包装shell脚本 shell脚本将当前目录更改为/c,然后运行/a/helloworld。一旦

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

例如,我有一个二进制文件
helloworld
,它在当前目录中创建文件
helloworld.txt


此文件位于目录
/a


目前,我在目录
/b
中。我想启动运行
。/a/helloworld
的程序,并在第三个目录
/c
的某个地方获取
helloworld.txt
,如果您总是希望它转到/c,那么在编写文件时使用绝对路径。

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

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

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

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

按如下方式调用程序:

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

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

(cd /c && /a/helloworld)
减少内存使用:要避免在hello world执行时子shell浪费内存,请通过exec调用
helloworld

(cd /c && exec /a/helloworld)
[感谢您提供有关改进此答案的提示!]

与的答案类似,再加上Josh的建议,但不会让shell进程继续运行:

sh -c 'cd /c && ../a/helloworld'
(cd /c && exec /a/helloworld)

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

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

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

  // rest of your program...

}
#包括
int main()
{
if(chdir(“/c”)<0)
{
printf(“失败的\n”);
返回-1;
}
//你程序的其余部分。。。
}

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

$ cd ~/b

$ ~/a/helloworld > ~/c/helloworld.txt
为什么不保持简单呢

cd一些路径和运行一些命令和&cd-


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

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

(pushd SOME_PATH && run_stuff; popd)
演示:

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

cd SOME_PATH && run_some_command ; cd -

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

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


+1表示正确,尽管答案只是一个外围答案。有没有办法将参数传递给这个shell?与$1和$2一样?@segfault:子shell可以完全访问周围的作用域。它似乎暂时位于该目录中,不是吗?您可以通过执行$*、$@或“$@”来传递所有参数(如果希望参数使用双引号)如果我将这一行添加到/etc/rc.d/rc.local,它会工作吗?我发现了一个困难的方法,
su
在运行任何
-c
命令之前将工作目录重置为您指定的用户的主目录。这对我很有帮助。你写@mezhaka,应该考虑:)警告:如果
运行某个命令
失败,
cd-
将无法执行。他希望在shell脚本中而不是在C中执行该操作。此外,对二进制文件进行子处理将是一个可怕的想法。Sahil在下面给出了类似的建议。如果命令失败,它将不起作用。考虑<代码> StudioApthPosith&& RunsToos&Popd——如果RunSuthOffice失败,将不会执行POPD。迟答复,这取决于BASH文件的设置。Bash可以在命令失败后继续执行命令(不像使用&&),但是可以使用文件中的
set-e
将其设置为不执行命令,然后它将无法
popd
;popd比当前答案更好,因为pushd/popd语义是专门为这种情况设计的,即进入某个目录,然后返回到原始目录。它是如何工作的,定义为alias,我需要传递一个param?我认为您需要编写一个shell脚本,向其中传递执行一系列命令的参数,这是您无法做到的在别名中间传递一个参数。如果你需要帮助写,你应该问一个单独的问题,并参考这一个。一旦你有了shell脚本,你就可以编写一个别名来调用你的新脚本。这根本不会改变工作目录-我认为你回答的问题与被问到的问题不同。来这里是为了找到你回答的问题的答案。谢谢Lol将其用于FreeBSD的jexec在指定的工作目录中的监狱中执行命令。
/root/server/user/home/bin/script.sh