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


20

我们有env(1)来修改我们要运行的命令的环境(例如env MANPAGER=more man dtrace)。除了修改要在其中启动命令的目录之外,是否有类似内容?

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

theMagicCommand /new/cwd myProgram

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

daemon -p /tmp/pid env VAR=value theMagicCommand /new/cwd myProgram

到目前为止,我可以想到以下解决方案,不幸的是,该解决方案没有与env(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文件中Path)。


6
为什么cd /new/cwd && env VAR=value myProgram不满足您的标准?
jpaugh

这已经是一个问题了,皮奥特洛夫斯基(M. Piotrowski)在哪里解释说这与并不相同env。看看env。比较它rtprioidprionumactljexecchrt,和确实在工具包中的命令在答案中提到。有一个模式,它是链加载。
JdeBP '18

3
“接口”是什么意思?为什么不使用(cd the/cwd; cmd)
康拉德·鲁道夫

2
@KonradRudolph例如,如果不(cd the/cwd; cmd)使用sh(1)将其包装,则无法轻松传递给env(1)。
Mateusz Piotrowski

Answers:


19

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

但是您不必将该脚本编写到文件中,只需内联即可:

sh -c 'CDPATH= cd -P -- "$1" && shift && exec "$@"' sh /some/dir cmd args

(假设目录不是-)。加CDPATH=(以防环境中有一个),-P使其表现得更像直线chdir()

或者,您可以直接使用perlwho的chdir()功能chdir()

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

哦耶。这与我在问题中包含的脚本非常方便。我担心我正在寻找的实用程序不存在,因为它的功能已经可以通过较短的sh(1)oneliner获得。
Mateusz Piotrowski

8
如果您已经在跑步sh,也可以这样做(cd /wherever && exec /my/command)。该()隐含打开一个子shell来运行命令包裹,当然,exec摆脱多余的shell进程尽快/my/command启动运行。
jpaugh

2
现已删除的答案中建议了这一点。发问者解释说,这不是对xe要求的答案。
JdeBP '18

15

daemontools世界和其他地方使用的工具集具有此功能以及更多功能。已经有很多年了;并且广泛可用。

  • 韦恩·马歇尔(Wayne Marshall)的表演有runtool

    runtool -c / new / cwd myProgram
  • Laurent Bercot的执行官有cd

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

    chdir / new / cwd myProgram

所有这些都是链条加载工具,旨在专门用于这类链条。这些工具箱中有很多用于其他目的的链条装载工具可供选择。

进一步阅读

  • /unix//a/353698/5132
  • 洛朗·贝科特(Laurent Bercot)(2018-08-01)。“参考”。执行线。skarnet.org。
  • Laurent Bercot(2018-11-08)。“参考”。s6。skarnet.org。
  • 乔纳森·德·博伊恩·波拉德(2018)。“ 命令和工具列表 ”。 nosh指南。软件。

11

有这么受欢迎的程序。这就是所谓的...不放你的椅子......击鼓声...... env。自版本8.28(而非POSIX)以来,GNU版本具有-C使您可以根据需要设置目录的选项:

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

    概要
           env [OPTION] ... [-] [NAME = VALUE] ... [COMMAND [ARG] ...]

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

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

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

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

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

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

           --help显示此帮助并退出

           - 版
                  输出版本信息并退出

           仅仅意味着-i。如果没有命令,请打印结果环境。


很酷,尽管在macOS和FreeBSD上无法立即使用。
Mateusz Piotrowski

1

某些程序为此提供了一个选项,例如Git:

-C <path>

就像git<path>而不是当前工作目录中启动一样运行。

和做:

-C dir--directory=dir

dir在读取makefile或执行其他任何操作之前,请更改目录。

和焦油:

-C--directory=DIR

DIR在执行任何操作之前,请更改为。此选项区分顺序,即会影响后面的所有选项。


是。尽管我的问题是如果myProgram不提供这样的选择怎么办...感谢您的贡献,但恐怕它根本无法回答我的问题。
Mateusz Piotrowski
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.