使用Linux shell,如何启动与当前工作目录不同的工作目录的程序?
例如,我有一个二进制文件helloworld,它在当前目录中创建了文件hello-world.txt。 这个文件在目录/a中。
目前,我在目录/b。我想启动我的程序运行..然后在第三个目录/c中获取hello-world.txt。
使用Linux shell,如何启动与当前工作目录不同的工作目录的程序?
例如,我有一个二进制文件helloworld,它在当前目录中创建了文件hello-world.txt。 这个文件在目录/a中。
目前,我在目录/b。我想启动我的程序运行..然后在第三个目录/c中获取hello-world.txt。
当前回答
如果你想在你的程序中执行这个,那么我会这样做:
#include <unistd.h>
int main()
{
if(chdir("/c") < 0 )
{
printf("Failed\n");
return -1 ;
}
// rest of your program...
}
其他回答
像这样调用程序:
(cd /c; /a/helloworld)
括号会生成一个子shell。然后这个子shell将其工作目录更改为/c,然后从/a执行helloworld。程序退出后,子shell终止,将您返回到父shell的提示符,在您启动的目录中。
错误处理:为了避免在没有改变目录的情况下运行程序,例如,当拼写错误/c时,使helloworld的执行有条件:
(cd /c && /a/helloworld)
减少内存使用:为了避免在执行helloworld时浪费子shell的内存,可以通过exec调用helloworld:
(cd /c && exec /a/helloworld)
[感谢Josh和Juliano给出的改进这个答案的建议!]]
一个不需要子shell并且内置于bash的选项
(pushd SOME_PATH && run_stuff; popd)
演示:
$ pwd
/home/abhijit
$ pushd /tmp # directory changed
$ pwd
/tmp
$ popd
$ pwd
/home/abhijit
一种方法是创建包装器外壳脚本。
shell脚本将当前目录更改为/c,然后运行/a/helloworld。shell脚本退出后,当前目录将恢复到/b。
下面是一个bash shell脚本示例:
#!/bin/bash
cd /c
/a/helloworld
如果你想在你的程序中执行这个,那么我会这样做:
#include <unistd.h>
int main()
{
if(chdir("/c") < 0 )
{
printf("Failed\n");
return -1 ;
}
// rest of your program...
}
sh -c 'cd /c && ../a/helloworld'