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)
Jde*_*eBP 15
daemontools 世界和其他地方使用的工具集除此之外还有更多;已经有很多年了;并且被广泛使用。
runtool:runtool -c /new/cwd myProgram
cd:cd /new/cwd myProgram
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,则打印结果环境。