进一步阅读

进一步阅读

我们有环境(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().

或者,您可以直接使用perlwho 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

所有这些都是链条装载工具,专门设计用于此类链条。这些工具包中有多种用于其他目的的链加载工具可供选择。

进一步阅读

答案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在执行任何操作之前更改为。该选项是顺序敏感的,即它影响后面的所有选项。

相关内容