我们有环境(1)修改我们要运行的命令的环境(例如env MANPAGER=more man dtrace
)。是否有类似的东西,但用于修改命令将在其中启动的目录?
理想情况下,我希望它看起来像这样:
theMagicCommand /new/cwd myProgram
这样它就可以与其他类似 env(1) 的命令“链接”,例如,
daemon -p /tmp/pid env VAR=value theMagicCommand /new/cwd myProgram
到目前为止我能想到以下解决方案,不幸的是没有相同的解决方案界面作为环境(1):
cd /new/cwd && myProgram
另外,我可以创建一个简单的 shell 脚本,如下所示:
#! /bin/sh -
cd "${1:?Missing the new working directory}" || exit 1
shift
exec "${@:?Missing the command to run}"
但我正在寻找已经存在的东西(至少在 macOS 和 FreeBSD 上)。
myProgram
不一定是桌面应用程序(在这种情况下我可以使用小路键入 .desktop 文件)。
答案1
AFAIK,POSIX 工具箱中没有这样的专用实用程序。但在运行命令之前,通常会像sh
在脚本中那样调用来设置环境(cwd、限制、stdout/in/err、umask...)sh
。
但您不必将该脚本写入文件中,只需内联即可:
sh -c 'CDPATH= cd -P -- "$1" && shift && exec "$@"' sh /some/dir cmd args
(假设该目录不是-
)。添加CDPATH=
(如果环境中有一个)并-P
让它表现得更像一个直的chdir()
.
或者,您可以直接使用perl
who does开箱即用。chdir()
chdir()
perl -e 'chdir(shift@ARGV) or die "chdir: $!"; exec @ARGV or die "exec: $!"
' /some/dir cmd args
答案2
daemontools 世界和其他地方使用的工具集具有此功能以及更多功能;已经有很多年了;并被广泛使用。
- 韦恩·马歇尔的犯人有
runtool
:runtool -c /new/cwd myProgram
- 洛朗·贝尔科特 (Laurent Bercot) 的高管
cd
:cd /new/cwd myProgram
- 我的小吃工具集有
chdir
:chdir /new/cwd myProgram
所有这些都是链条装载工具,专门设计用于此类链条。这些工具包中有多种用于其他目的的链加载工具可供选择。
进一步阅读
- https://unix.stackexchange.com/a/353698/5132
- 洛朗·贝尔科特 (2018-08-01)。 “参考”。执行。 skarnet.org。
- 洛朗·贝尔科特 (2018-11-08)。 “参考”。s6。 skarnet.org。
- 乔纳森·德博因·波拉德 (2018)。 ”命令和工具列表”。 小吃指南。软件。
答案3
有这样一个受欢迎的节目。它被称为...抓住你的椅子...击鼓env
...。从版本 8.28 开始,GNU 版本(而不是 POSIX)具有-C
允许您根据需要设置目录的选项:
姓名 env - 在修改后的环境中运行程序 概要 env [选项]...[-][名称=值]...[命令[参数]...] 描述 将环境中的每个 NAME 设置为 VALUE 并运行 COMMAND。 长期权的强制性参数对于短期权也是强制性的。 -我,--忽略环境 从空环境开始 -0,- 无效的 每个输出行以 NUL 结束,而不是换行符 -u,--取消设置=姓名 从环境中删除变量 -C,--chdir=目录 将工作目录更改为 DIR - 帮助显示此帮助并退出 - 版本 输出版本信息并退出 仅仅 - 意味着-我。如果没有 COMMAND,则打印结果环境。
答案4
某些程序有一个选项,例如 Git:
-C <path>
运行就像在而不是当前工作目录
git
中启动一样。<path>
和做:
-C dir
,--directory=dir
dir
在读取 makefile 或执行任何其他操作之前,请先更改目录。
和焦油:
-C
,--directory=DIR
DIR
在执行任何操作之前更改为。该选项是顺序敏感的,即它影响后面的所有选项。