如何使用 Linux shell 运行与当前工作目录不同的程序?
- 2024-10-17 08:46:00
- admin 原创
- 77
问题描述:
使用Linux shell,如何启动具有与当前工作目录不同的工作目录的程序?
例如,我有一个二进制文件,它在当前目录helloworld
中创建文件。
该文件位于目录内。hello-world.txt
/a
目前,我在目录中/b
。我想启动我的程序../a/helloworld
并获取hello-world.txt
第三个目录中的某个位置/c
。
解决方案 1:
像这样调用该程序:
(cd /c; /a/helloworld)
括号导致生成一个子 shell。然后,该子 shell 将其工作目录更改为/c
,然后helloworld
从执行/a
。程序退出后,子 shell 终止,并返回到父 shell 的提示符,即您启动的目录。
错误处理:为了避免在未更改目录的情况下运行程序(例如拼写错误)/c
,请有条件地执行helloworld
:
(cd /c && /a/helloworld)
减少内存使用:为了避免子 shell 在执行 hello world 时浪费内存,请helloworld
通过 exec 调用:
(cd /c && exec /a/helloworld)
[感谢Josh 和 Juliano提供的改进此答案的建议!]
解决方案 2:
与David Schmitt的回答类似,加上 Josh 的建议,但不会让 shell 进程运行:
(cd /c && exec /a/helloworld)
这种方式更类似于您通常在 shell 上运行命令的方式。要查看实际差异,您必须ps ef
从另一个 shell 运行每个解决方案。
解决方案 3:
使用 pushd/popd 和子 shell:
(pushd SOME_PATH && run_stuff; popd)
如果你不想要子 shell,你可以将它们作为单独的命令运行,但请注意,如果其中任何一个失败,你的 shell 最终可能不会回到原始目录:
pushd SOME_PATH
run_stuff
popd
演示:
$ pwd
/home/abhijit
$ pushd /tmp # directory changed
$ pwd
/tmp
$ popd
$ pwd
/home/abhijit
解决方案 4:
sh -c 'cd /c && ../a/helloworld'
解决方案 5:
只需将最后的“&&”改为“;”,无论命令失败或成功,它都会返回:
cd SOME_PATH && run_some_command ; cd -
解决方案 6:
我一直认为 UNIX 工具应该写成过滤器,从 stdin 读取输入并将输出写入 stdout。如果可能的话,您可以更改 helloworld 二进制文件以将文本文件的内容写入 stdout 而不是特定文件。这样您就可以使用 shell 在任何地方写入文件。
$ cd ~/b
$ ~/a/helloworld > ~/c/helloworld.txt
解决方案 7:
为什么不保持简单
cd SOME_PATH && run_some_command && cd -
最后一个“cd”命令将带您返回上一个 pwd 目录。这应该适用于所有 *nix 系统。
解决方案 8:
其中一种方法是创建一个包装器 shell 脚本。
该 shell 脚本会将当前目录更改为 /c,然后运行 /a/helloworld。一旦 shell 脚本退出,当前目录将恢复为 /b。
以下是一个 bash shell 脚本示例:
#!/bin/bash
cd /c
/a/helloworld
解决方案 9:
以下内容满足了我的简单需求,即设置一个别名,可以向其附加参数,而不必将指令放在函数中;在 Bash 和 ZSH 中有效:
$ CWD=/your/target/dir command args
我的用例:我有一个名为的 shell 脚本run-service
,它根据自身位置解析其他文件的路径。如果我用 调用它cd ~/Code/company/scripts && run-service dev/some-service
,它将期望在 中找到一个配置文件~/Code/company/services/dev/some-service
。因此,我不必总是cd
进入目录并调用脚本,而是只需执行以下操作:
# Alias definition
alias run-service="CWD=/your/target/dir run-service"
# Calling the alias
$ run-service foo
它可能过于简单而不能普遍使用,但是对于我的基本用例来说它很有用。
解决方案 10:
如果您始终希望它转到/C,请在写入文件时使用绝对路径。
解决方案 11:
如果现在还有人在搜索这个,以下是我在 Windows 10 上操作的方法:
Set-Location -Path "<absolute path to your working directory>"; Start-Process "<absolute path to your file>"
解决方案 12:
如果你想在你的程序中执行此操作,那么我会执行以下操作:
#include <unistd.h>
int main()
{
if(chdir("/c") < 0 )
{
printf("Failed
");
return -1 ;
}
// rest of your program...
}
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件