Como agrupar um comando para que um script, em vez de seu filho, apareça como executável?

Como agrupar um comando para que um script, em vez de seu filho, apareça como executável?

Envolvi meu script R /usr/lib/R/bin/exec/Rpara limitar o uso de memória: renomeei-o para /usr/lib/R/bin/exec/R_orige criei um script bash nomeado /usr/lib/R/bin/exec/Rcom o conteúdo:

#!/bin/bash
echo "Memory limited to 10G"
ulimit -Sv 10000000 #limit memory for 64-bit version
/usr/lib/R/bin/exec/R_orig "$@"

Esta é uma grande melhoria na minha experiência com esse programa específico, mas descobri que algumas partes dele realmente usam o nome do executável para determinar os caminhos de instalação do pacote e, como o nome do executável é modificado, eles falham.

É possível fazer com que meu script /usr/lib/R/bin/exec/Rseja visto como executável por si só - de modo que, por exemplo, topnão mostre um processo filho separado R_orig, mas apenas o processo R?

Responder1

Não faça isso. Ao substituir o original Rpor algo que gera uma string na saída padrão, você pode confundir aplicativos que podem analisar sua saída.

Em vez disso, crie o script wrapper com um novo nome e deixe o Rexecutável original como estava. Não coloque esse script em /usr/lib/R/bin/execalgum lugar como /usr/local/bin(se ele precisar ser acessível a todos os usuários). Além disso, isso não confundirá atualizações de pacotes posteriores ou scripts de desinstalação.

Alternativamente, você pode definir uma função shell em seus arquivos de inicialização do shell:

myR () (
    echo "Memory limited to 10G"
    ulimit -Sv 10000000 #limit memory for 64-bit version
    exec /usr/lib/R/bin/exec/R "$@"
)

Outra opção óbvia seria definir o limite nos scripts de inicialização do shell ( ~/.bashrcfor bash). O limite será transferido para qualquer processo iniciado no shell.

Responder2

Para responder à sua pergunta, altere a linha final do seu script para

exec -a "$0" /usr/lib/R/bin/exec/R_orig "$@"

Isso substituirá o processo atual (o shell que executa o script) pelo programa R_orig em vez de executar o R_orig como filho do script. Além disso passará o nome do programa, o tradicional primeiro argumento como nome original. A maioria dos programas que procuram a instalação de pacotes usará esse primeiro nome.

Concordo com @Kusalananda que é uma má ideia exibir a mensagem "Memória limitada a 10G". Se você quiser fazer isso, envie-o para stderr. Isso significa que seu script deve ficar assim.

#!/bin/bash
echo "Memory limited to 10G" >&2
ulimit -Sv 10000000 #limit memory for 64-bit version
exec -a "$0" /usr/lib/R/bin/exec/R_orig "$@"

informação relacionada