使用Linux shell,如何使用与当前工作目录不同的工作目录启动程序?
例如,我有一个在当前目录helloworld
中创建文件的二进制文件。
这个文件在目录里面。hello-world.txt
/a
目前,我在目录中/b
。我想开始运行我的程序../a/helloworld
并获得hello-world.txt
第三个目录中的某个位置/c
。
使用Linux shell,如何使用与当前工作目录不同的工作目录启动程序?
例如,我有一个在当前目录helloworld
中创建文件的二进制文件。
这个文件在目录里面。hello-world.txt
/a
目前,我在目录中/b
。我想开始运行我的程序../a/helloworld
并获得hello-world.txt
第三个目录中的某个位置/c
。
像这样调用程序:
(cd /c; /a/helloworld)
括号导致生成子外壳。然后,此子 shell 将其工作目录更改为/c
,然后helloworld
从执行/a
。程序退出后,子 shell 终止,将您返回到父 shell 的提示符,位于您开始的目录中。
错误处理:为避免在未更改目录的情况下运行程序,例如拼写错误时/c
,请根据条件执行helloworld
:
(cd /c && /a/helloworld)
减少内存使用:为避免在 hello world 执行时让 subshell 浪费内存,请helloworld
通过 exec 调用:
(cd /c && exec /a/helloworld)
[感谢Josh 和 Juliano提供改进此答案的提示!]
类似于David Schmitt的回答,加上 Josh 的建议,但不会让 shell 进程运行:
(cd /c && exec /a/helloworld)
这种方式更类似于您通常在 shell 上运行命令的方式。要查看实际差异,您必须ps ef
使用每个解决方案从另一个 shell 运行。
一个不需要 subshell 并且内置于 bash 的选项
(pushd SOME_PATH && run_stuff; popd)
演示:
$ pwd
/home/abhijit
$ pushd /tmp # directory changed
$ pwd
/tmp
$ popd
$ pwd
/home/abhijit
sh -c 'cd /c && ../a/helloworld'
我一直认为 UNIX 工具应该写成过滤器,从标准输入读取输入并将输出写入标准输出。如果可能,您可以更改 helloworld 二进制文件以将文本文件的内容写入标准输出而不是特定文件。这样您就可以使用 shell 在任何地方写入文件。
$ cd ~/b
$ ~/a/helloworld > ~/c/helloworld.txt
只需将最后一个“&&”改成“;” 无论命令失败还是成功,它都会返回:
cd SOME_PATH && run_some_command ; cd -
一种方法是创建一个包装外壳脚本。
shell 脚本会将当前目录更改为 /c,然后运行 /a/helloworld。一旦 shell 脚本退出,当前目录将恢复到 /b。
这是一个 bash shell 脚本示例:
#!/bin/bash
cd /c
/a/helloworld
为什么不保持简单
cd SOME_PATH && run_some_command && cd -
最后一个“cd”命令将带您回到最后一个 pwd 目录。这应该适用于所有 *nix 系统。
如果您总是希望它转到 /C,请在写入文件时使用绝对路径。
如果您想在程序中执行此操作,那么我会执行以下操作:
#include <unistd.h>
int main()
{
if(chdir("/c") < 0 )
{
printf("Failed\n");
return -1 ;
}
// rest of your program...
}
从当前目录提供脚本目录的完整路径以执行命令
/root/server/user/home/bin/script.sh