Nous avons env (1) pour modifier l'environnement de la commande que nous voulons exécuter (par exemple env MANPAGER=more man dtrace
). Y a-t-il quelque chose de similaire, mais pour modifier le répertoire dans lequel la commande va être lancée?
Idéalement, je voudrais qu'il ressemble à ceci:
theMagicCommand /new/cwd myProgram
De cette façon, il pourrait être "enchaîné" avec d'autres commandes de type env (1), par exemple,
daemon -p /tmp/pid env VAR=value theMagicCommand /new/cwd myProgram
Jusqu'à présent, je peux penser à la solution suivante, qui n'a malheureusement pas la même interface que env (1):
cd /new/cwd && myProgram
De plus, je peux simplement créer un simple script shell comme celui-ci:
#! /bin/sh -
cd "${1:?Missing the new working directory}" || exit 1
shift
exec "${@:?Missing the command to run}"
mais je cherche quelque chose qui existe déjà (au moins sur macOS et FreeBSD).
myProgram
n'est pas nécessairement une application de bureau (auquel cas je pourrais simplement utiliser la clé Path dans un fichier .desktop ).
cd /new/cwd && env VAR=value myProgram
répond pas à vos critères?env
. Regardezenv
. Comparer àrtprio
,idprio
,numactl
,jexec
,chrt
, et en effet les commandes dans les boîtes à outils mentionnés dans les réponses. Il y a un modèle et c'est le chargement de la chaîne.(cd the/cwd; cmd)
?(cd the/cwd; cmd)
à env (1) sans l'envelopper avec sh (1).Réponses:
AFAIK, il n'y a pas un tel utilitaire dédié dans le coffre à outils POSIX. Mais il est courant d'invoquer
sh
pour configurer un environnement (cwd, limites, stdout / in / err, umask ...) avant d'exécuter une commande comme vous le faites dans votresh
script.Mais vous n'êtes pas obligé d'écrire ce script dans un fichier, vous pouvez simplement l'intégrer:
(en supposant que le répertoire ne l'est pas
-
). AjoutCDPATH=
(au cas où il y en a un dans l'environnement) et-P
pour qu'il se comporte plus comme une ligne droitechdir()
.Alternativement, vous pouvez utiliser le
perl
dont sortchdir()
directementchdir()
de la boîte.la source
sh
, vous pouvez également le faire(cd /wherever && exec /my/command)
. Le()
ouvre implicitement un sous-shell pour exécuter les commandes encapsulées, et bien sûr,exec
se débarrasse du processus de shell supplémentaire aussi rapidement qu'il/my/command
commence à s'exécuter.Les jeux d'outils utilisés dans le monde des daemontools, et ailleurs, ont cela et plus encore; ont depuis de nombreuses années; et sont largement disponibles.
runtool
:cd
:chdir
:Ce sont tous des outils de chargement de chaîne, conçus pour être utilisés exactement dans ces types de chaînes. Il existe une large sélection d'outils de chargement de chaîne dans ces boîtes à outils à d'autres fins.
Lectures complémentaires
la source
Il existe un programme très populaire. Il est appelé ... sur votre chaise prise ... ... drumroll
env
. La version GNU, depuis la version 8.28, pas POSIX, a l'-C
option qui vous permet de définir le répertoire comme vous le souhaitez:la source
Certains programmes ont une option pour cela, comme Git:
et fais:
et Tar:
la source
myProgram
ne propose pas une telle option ... Merci pour votre contribution mais je crains qu'elle ne réponde pas du tout à ma question.