使用Linux shell,如何从当前工作目录启动具有不同工作目录的程序?
例如,我有一个二进制文件helloworld
,它在当前目录中创建文件hello-world.txt
。该文件位于目录/a
内。目前我在目录/b
中。我想启动运行../a/helloworld
的程序并将hello-world.txt
放在第三个目录/c
中的某个位置。
答案 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