Existe um utilitário POSIX (ou pelo menos um popular) para definir o diretório de trabalho atual ao invocar um programa?

19

Temos env (1) para modificar o ambiente do comando que queremos executar (por exemplo env MANPAGER=more man dtrace ). Existe algo semelhante, mas para modificar o diretório em que o comando será iniciado?

Idealmente, gostaria que fosse assim:

theMagicCommand /new/cwd myProgram

Desta forma, poderia ser "encadeado" com outros comandos tipo env (1), por exemplo,

daemon -p /tmp/pid env VAR=value theMagicCommand /new/cwd myProgram

Até agora eu posso pensar na seguinte solução, que infelizmente não tem a mesma interface como env (1):

cd /new/cwd && myProgram

Além disso, posso criar um script de shell simples como este:

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

mas estou procurando algo que já existe (pelo menos no macOS e no FreeBSD).

myProgram não é necessariamente um aplicativo de área de trabalho (nesse caso, eu poderia usar apenas as < em> Caminho chave em um arquivo .desktop ).

    
por Mateusz Piotrowski 09.11.2018 / 16:01

4 respostas

19

AFAIK, não existe tal utilidade dedicada na caixa de ferramentas POSIX. Mas é comum invocar sh para configurar um ambiente (cwd, limites, stdout / in / err, umask ...) antes de executar um comando como no seu script sh .

Mas você não precisa escrever esse script em um arquivo, basta inseri-lo:

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

(assumindo que o diretório não é - ). Adicionando CDPATH= (caso haja um no ambiente) e -P para que ele se comporte mais como um chdir() .

Como alternativa, você pode usar perl cujo chdir() faz um chdir() direto da caixa.

perl -e 'chdir(shift@ARGV) or die "chdir: $!"; exec @ARGV or die "exec: $!"
         ' /some/dir cmd args
    
por 09.11.2018 / 16:12
15

Os conjuntos de ferramentas usados no mundo dos daemontools, e em outros lugares, têm isso e muito mais; teve por muitos anos; e estão amplamente disponíveis.

  • O criminoso de Wayne Marshall tem runtool :
    runtool -c /new/cwd myProgram
  • O execline de Laurent Bercot tem cd :
    cd /new/cwd myProgram
  • my nosh tools tem chdir :
    chdir /new/cwd myProgram

Todas elas são ferramentas de carregamento de corrente, projetadas para serem usadas exatamente nesses tipos de correntes. Há uma ampla seleção de ferramentas de carregamento de corrente nesses kits de ferramentas para outras finalidades.

Leitura adicional

por 09.11.2018 / 17:29
12

Existe um programa tão popular. É chamado ... segure sua cadeira ... drumroll ... env . A versão GNU, desde a versão 8.28, não POSIX, possui a opção -C que permite que você configure o diretório exatamente como requer:

    NAME
           env - run a program in a modified environment

    SYNOPSIS
           env [OPTION]... [-] [NAME=VALUE]... [COMMAND [ARG]...]

    DESCRIPTION
           Set each NAME to VALUE in the environment and run COMMAND.

           Mandatory arguments to long options are mandatory for short options too.

           -i, --ignore-environment
                  start with an empty environment

           -0, --null
                  end each output line with NUL, not newline

           -u, --unset=NAME
                  remove variable from the environment

           -C, --chdir=DIR
                  change working directory to DIR

           --help display this help and exit

           --version
                  output version information and exit

           A mere - implies -i.  If no COMMAND, print the resulting environment.

    
por 10.11.2018 / 22:37
1

Certos programas têm uma opção para isso, como o Git:

-C <path>

Run as if git was started in <path> instead of the current working directory.

e Make:

-C dir, --directory=dir

Change to directory dir before reading the makefiles or doing anything else.

e Tar:

-C, --directory=DIR

Change to DIR before performing any operations. This option is order-sensitive, i.e. it affects all options that follow.

    
por 10.11.2018 / 00:55