是否有 POSIX(或至少是流行的)实用程序来在调用程序时设置当前工作目录?

Mat*_*ski 21 shell freebsd cwd

我们有env(1)来修改我们想要运行的命令的环境(例如env MANPAGER=more man dtrace)。是否有类似的东西,但用于修改命令将在其中启动的目录?

理想情况下,我希望它看起来像这样:

theMagicCommand /new/cwd myProgram
Run Code Online (Sandbox Code Playgroud)

这样,它可以与其他类似 env(1) 的命令“链接”,例如,

daemon -p /tmp/pid env VAR=value theMagicCommand /new/cwd myProgram
Run Code Online (Sandbox Code Playgroud)

到目前为止,我可以想到以下解决方案,不幸的是它没有与 env(1)相同的接口

cd /new/cwd && myProgram
Run Code Online (Sandbox Code Playgroud)

另外,我可以像这样创建一个简单的shell脚本:

#! /bin/sh -
cd "${1:?Missing the new working directory}" || exit 1
shift
exec "${@:?Missing the command to run}"
Run Code Online (Sandbox Code Playgroud)

但我正在寻找已经存在的东西(至少在 macOS 和 FreeBSD 上)。

myProgram不一定是桌面应用程序(在这种情况下,我可以只使用.desktop 文件中Path)。

Sté*_*las 19

AFAIK,POSIX 工具箱中没有这样的专用实用程序。但是sh在运行命令之前调用以设置环境(cwd、limits、stdout/in/err、umask...)是很常见的,就像在sh脚本中一样。

但是您不必将该脚本编写在文件中,您可以将其内联:

sh -c 'CDPATH= cd -P -- "$1" && shift && exec "$@"' sh /some/dir cmd args
Run Code Online (Sandbox Code Playgroud)

(假设目录不是-)。添加CDPATH=(如果环境中有一个)并-P使其表现得更像一个直接的chdir().

或者,您可以使用perlwhochdir()直接chdir()开箱即用。

perl -e 'chdir(shift@ARGV) or die "chdir: $!"; exec @ARGV or die "exec: $!"
         ' /some/dir cmd args
Run Code Online (Sandbox Code Playgroud)

  • 如果你已经在运行 `sh`,你也可以执行 `(cd /wherever && exec /my/command)`。`()` 隐式地打开一个子 shell 来运行包装的命令,当然,`exec` 会在 `/my/command` 开始运行时尽快摆脱额外的 shell 进程。 (8认同)
  • 这是在现已删除的答案中提出的。提问者解释说,这不是对 xe 提出的问题的回答。 (2认同)

Jde*_*eBP 15

daemontools 世界和其他地方使用的工具集除此之外还有更多;已经有很多年了;并且被广泛使用。

  • 韦恩马歇尔的 perp 有runtool

    runtool -c /new/cwd myProgram
  • Laurent Bercot 的 execline 有cd

    cd /new/cwd myProgram
  • 我的 nosh 工具集chdir

    chdir /new/cwd myProgram

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

进一步阅读


n. *_* m. 11

有这么一个受欢迎的节目。这就是所谓的...不放你的椅子......击鼓声...... env。GNU 版本,从 8.28 版开始,而不是 POSIX,有一个-C选项可以让您根据需要设置目录:

    姓名
           env - 在修改后的环境中运行程序

    概要
           env [选项]... [-] [名称=值]... [命令 [ARG]...]

    描述
           将环境中的每个 NAME 设置为 VALUE 并运行 COMMAND。

           长选项的强制性参数对于短选项也是强制性的。

           -i , --ignore-environment
                  从一个空的环境开始

           -0 , --null
                  用 NUL 结束每个输出行,而不是换行符

           -u , --unset =NAME
                  从环境中删除变量

           -C , --chdir =DIR
                  将工作目录更改为 DIR

           --help显示此帮助并退出

           - 版本
                  输出版本信息并退出

           仅仅 - 意味着-i。如果没有 COMMAND,则打印结果环境。