AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 480776
Accepted
Mateusz Piotrowski
Mateusz Piotrowski
Asked: 2018-11-10 07:01:06 +0800 CST2018-11-10 07:01:06 +0800 CST 2018-11-10 07:01:06 +0800 CST

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

  • 772

我们有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键)。

shell freebsd
  • 4 4 个回答
  • 3033 Views

4 个回答

  • Voted
  1. Best Answer
    Stéphane Chazelas
    2018-11-10T07:12:37+08:002018-11-10T07:12:37+08:00

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

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

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

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

    或者,您可以使用perlwho chdir()did a straight chdir()out of the box。

    perl -e 'chdir(shift@ARGV) or die "chdir: $!"; exec @ARGV or die "exec: $!"
             ' /some/dir cmd args
    
    • 19
  2. JdeBP
    2018-11-10T08:29:09+08:002018-11-10T08:29:09+08:00

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

    • 韦恩·马歇尔的 perp 有runtool:

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

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

      chdir /new/cwd myProgram

    所有这些都是链加载工具,旨在用于这些类型的链。这些工具包中有多种用于其他用途的链式加载工具。

    进一步阅读

    • https://unix.stackexchange.com/a/353698/5132
    • 洛朗·伯科特 (2018-08-01)。“参考”。执行线。skarnet.org。
    • 洛朗·伯科特 (2018-11-08)。“参考”。s6。skarnet.org。
    • 乔纳森·德博因·波拉德 (2018)。“命令和工具列表”。 小吃指南。软件。
    • 15
  3. n. 1.8e9-where's-my-share m.
    2018-11-11T13:37:50+08:002018-11-11T13:37:50+08:00

    有这样一个受欢迎的节目。它被称为......抓住你的椅子......鼓声env...... GNU 版本,从 8.28 版开始,而不是 POSIX,具有-C允许您根据需要设置目录的选项:

        姓名
               env - 在修改后的环境中运行程序
    
        概要
               环境 [选项]... [-] [名称=值]... [命令 [ARG]...]
    
        描述
               在环境中将每个 NAME 设置为 VALUE 并运行 COMMAND。
    
               多头期权的强制性参数对于空头期权也是强制性的。
    
               -i,--忽略环境
                      从一个空的环境开始
    
               -0 , --null
                      以 NUL 结束每个输出行,而不是换行符
    
               -u , --unset =NAME
                      从环境中删除变量
    
               -C , --chdir =DIR
                      将工作目录更改为 DIR
    
               --help显示此帮助并退出
    
               - 版本
                      输出版本信息并退出
    
               仅仅 - 意味着-i。如果没有 COMMAND,则打印生成的环境。
    
    
    • 11
  4. Zombo
    2018-11-10T15:55:00+08:002018-11-10T15:55:00+08:00

    某些程序对此有一个选项,例如 Git:

    -C <path>

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

    和做:

    -C dir,--directory=dir

    dir在读取 makefile 或执行任何其他操作之前切换到目录。

    和焦油:

    -C,--directory=DIR

    DIR在执行任何操作之前更改为。这个选项是顺序敏感的,即它影响后面的所有选项。

    • 1

相关问题

  • FreeBSD 的 sh:列出函数

  • 有没有办法让 ls 只显示某些目录的隐藏文件?

  • grep -v grep 有什么作用

  • 如何将带有〜的路径保存到变量中?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    ssh 无法协商:“找不到匹配的密码”,正在拒绝 cbc

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    如何卸载内核模块“nvidia-drm”?

    • 13 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add 返回:“连接代理时出错:没有这样的文件或目录” 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya 为什么 Linux 使用 LF 作为换行符? 2017-12-20 05:48:21 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve