Существует ли 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

Кроме того, я могу просто создать простой скрипт оболочки:

#! /bin/sh -
cd "${1:?Missing the new working directory}" || exit 1
shift
exec "${@:?Missing the command to run}"

но я ищу что-то, что уже существует (по крайней мере, в MacOS и FreeBSD).

myProgramне обязательно является настольным приложением (в этом случае я мог бы просто использовать ключ Path в файле .desktop ).

Матеуш Пиотровский
источник
6
Почему cd /new/cwd && env VAR=value myProgramне соответствует вашему критерию?
jpaugh
Это уже в вопросе, где М. Пиотровский объяснил, что это не тот же интерфейс, что и env. Посмотрите env. Сравните это rtprio, idprio, numactl, jexec, chrt, и в самом деле команды в наборы инструментов упоминается в ответах. Там есть шаблон, и это цепная загрузка.
JdeBP
3
Что вы подразумеваете под «интерфейсом»? А почему бы не использовать (cd the/cwd; cmd)?
Конрад Рудольф
2
@KonradRudolph Например, вы не можете легко перейти (cd the/cwd; cmd)к env (1), не заключая его в sh (1).
Матеуш Пиотровски

Ответы:

19

AFAIK, в сундуке с инструментами POSIX нет такой специальной утилиты. Но обычно вызывается shдля настройки среды (cwd, limit, stdout / in / err, umask ...) перед выполнением команды, как вы делаете в своем shскрипте.

Но вам не нужно писать этот скрипт в файле, вы можете просто вставить его:

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

(при условии, что каталог не -). Добавление CDPATH=(в случае, если оно есть в окружении) и -Pего поведение более прямолинейно chdir().

Кроме того, вы можете использовать perlчей- chdir()то прямо chdir()из коробки.

perl -e 'chdir(shift@ARGV) or die "chdir: $!"; exec @ARGV or die "exec: $!"
         ' /some/dir cmd args
Стефан Шазелас
источник
О да. Это очень удобный вариант сценария, который я включил в свой вопрос. Я боялся, что утилита, которую я ищу, не существует, так как ее функциональность уже доступна с относительно коротким sh (1) oneliner.
Матеуш Пиотровски
8
Если вы уже работаете sh, вы также можете сделать (cd /wherever && exec /my/command). ()Неявно открывает подоболочку для запуска обернутых команд, и, конечно же , execизбавляется от дополнительного процесса оболочки так быстро , как /my/commandначинает работать.
jpaugh
2
Это было предложено в удаленном ответе. Спрашивающий объяснил, что это не было ответом на то, что спросил Хе.
JdeBP
15

Наборы инструментов, используемые в мире daemontools и в других местах, имеют это и многое другое; имели в течение многих лет; и широко доступны.

Все это инструменты для загрузки цепей, предназначенные для использования именно в таких цепях. В этих наборах инструментов имеется широкий выбор инструментов для загрузки цепей для других целей.

дальнейшее чтение

JdeBP
источник
11

Есть такая популярная программа. Она называется ... держать на стуле ... барабанная дробь ... env. Версия GNU, начиная с версии 8.28, а не POSIX, имеет -Cопцию, которая позволяет вам установить каталог так, как вам нужно:

    НАЗВАНИЕ
           env - запустить программу в измененной среде

    СИНТАКСИС
           env [ОПЦИЯ] ... [-] [ИМЯ = ЗНАЧЕНИЕ] ... [КОМАНДА [АРГ] ...]

    ОПИСАНИЕ
           Установите каждое ИМЯ на ЗНАЧЕНИЕ в среде и запустите КОМАНДУ.

           Обязательные аргументы для длинных опций обязательны и для коротких опций.

           -i , --ignore-environment
                  начать с пустой среды

           -0 , --null
                  заканчивайте каждую выходную строку NUL, а не переводом строки

            , --unset = NAME
                  удалить переменную из среды

           -C , --chdir = DIR
                   изменить рабочий каталог на DIR

           --help показать эту помощь и выйти

           --версия
                  вывести информацию о версии и выйти

           Простое - подразумевает -i . Если нет КОМАНДЫ, распечатайте полученную среду.

п. местоимения м.
источник
Круто, хотя он недоступен "из коробки" на macOS и FreeBSD.
Матеуш Пиотровски
1

Некоторые программы имеют такую ​​возможность, например, Git:

-C <path>

Запускать, как если бы он gitбыл запущен <path>вместо текущего рабочего каталога.

и сделать:

-C dir, --directory=dir

Перейдите в каталог, dirпрежде чем читать make-файлы или делать что-либо еще.

и Tar:

-C, --directory=DIR

Измените на DIRперед выполнением каких-либо операций. Эта опция чувствительна к порядку, то есть влияет на все последующие опции.

Стивен Пенни
источник
Да. Хотя мой вопрос заключается в том, что, если myProgramтакая возможность не предоставляется ... Спасибо за ваш вклад, но я боюсь, что он вообще не отвечает на мой вопрос.
Матеуш Пиотровски