Чи є утиліта 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

О так. Це дуже зручна версія сценарію, який я включив у своє запитання. Я побоювався, що утиліта, яку я шукаю, не існує, оскільки її функціональність уже доступна з відносно коротким (1) oneliner.
Матеуш Піотровський

8
Якщо ви вже працюєте sh, ви також можете зробити (cd /wherever && exec /my/command). ()Неявно відкриває подоболочкі для запуску обгорнутих команд, і, звичайно ж , execпозбавляється від додаткового процесу оболонки так швидко , як /my/commandпочинає працювати.
jpaugh

2
Це було запропоновано у видаленій відповіді. Допитуючий пояснив, що це не відповідь на те, що Xe запитав.
JdeBP

15

Набори інструментів, які використовуються в світі демонтів, і в інших місцях, мають це і більше; були протягом багатьох років; і широко доступні.

Все це інструменти для завантаження ланцюгів, призначені для використання саме в таких ланцюгах. Існує широкий вибір інструментів для завантаження ланцюгів у цих наборах інструментів для інших цілей.

Подальше читання


11

Є така популярна програма. Вона називається ... тримати на стільці ... барабанний дріб ... env. Версія GNU, оскільки версія 8.28, а не POSIX, має -Cпараметр, який дозволяє встановлювати каталог так само, як потрібно:

    ІМ’Я
           env - запуск програми в модифікованому середовищі

    СИНОПИС
           env [ВАРІАНТ] ... [-] [NAME = VALUE] ... [COMMAND [ARG] ...]

    ОПИС
           Встановіть кожне NAME на VALUE у оточенні та запустіть COMMAND.

           Обов’язкові аргументи довгих варіантів є обов'язковими і для коротких варіантів.

           -i , --ignore-середовище
                  почніть з порожнього середовища

           -0 , --нуло
                  закінчуйте кожен вихідний рядок з NUL, а не з нового рядка

           -u , --unset = NAME
                  видалити змінну з оточення

           -C , --chdir = DIR
                   зміни робочого каталогу на DIR

           - допоможе відобразити цю допомогу та вийти

           --вертальність
                  інформація про вихідну версію та вихід

           Простий - означає  . Якщо немає COMMAND, надрукуйте отримане середовище.


Холодно, хоча він не доступний поза вікном на macOS та FreeBSD.
Матеуш Піотровський

1

У деяких програмах є такий варіант, як Git:

-C <path>

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

і зробіть:

-C dir, --directory=dir

Перейдіть до каталогу, dirперш ніж читати файли чи робити щось інше.

та смола:

-C, --directory=DIR

Змініть на, DIRперш ніж виконувати будь-які операції. Цей параметр залежить від порядку, тобто впливає на всі наступні варіанти.


Так. Хоча моє запитання полягає в тому, що якщо myProgramне передбачено такого варіанту ... Дякую за ваш внесок, але я боюся, що він взагалі не відповідає на моє запитання.
Матеуш Піотровський
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.