É possível descobrir se o nosso comando é originado de um script ou digitado manualmente na linha de comando?

1

Temos uma implementação para definir o ambiente para uma ferramenta específica com nosso comando personalizado.

Exemplo: custom_command tool_name

Este comando registra o tempo de invocação, usuário e nome da ferramenta em um arquivo de log.

E com esses registros, podemos descobrir quando uma ferramenta em particular foi usada pela última vez.

Agora, os usuários têm o hábito de colocar o comando em seu perfil de login.

Então, é possível descobrir se um comamnd é invocado digitando-o manualmente na linha de comando ou é originado de outro script e, se for, qual era o nome do script?

Eu tentei várias maneiras. Tudo o que posso descobrir é o nome do script pai, ou seja, o shell.

Meu entendimento é que isso não é possível. Mas estou apenas tentando a minha sorte.

    
por GP92 03.05.2018 / 08:29

2 respostas

0

Em bash scripts eu faço assim normalmente:

#!/bin/bash

if test "$0" != "$BASH_SOURCE"; then
    SOURCED=1
    MY_NAME=$BASH_SOURCE
else
    SOURCED=0
    MY_NAME=$0
fi

# do something here

if test "$SOURCED" = "1"; then
    # use return instead of exit
    return
fi

# do something here only when not sourced
exit
    
por 03.05.2018 / 09:19
0

Eu não acho que seja totalmente possível.

Você pode descobrir qual é o processo pai e quais são os parâmetros da linha de comando, mas no final do dia, ao executar um shell interativo, o processo pai dos programas executados a partir do script de inicialização é o mesmo dos programas executados. interativamente.

Se apenas onde a execução do .profile você poderia detectar isso pelo fato de que /etc/bashrc é originado depois disso (em que você poderia colocar um comando para parar de ignorar execuções deste shell).

Outra abordagem poderia ser verificar o horário de início do processo pai. Frequentemente, a execução interativa de um comando seria feita um pouco depois que o shell fosse iniciado, enquanto os scripts init seriam executados logo após o início do shell.

Uma ideia mais elaborada é substituir /bin/bash por um wrapper que controla a origem dos arquivos de inicialização de uma maneira mais personalizada (a ideia é semelhante à primeira ideia, mas para conseguir que você execute o comando após .bashrc ). Eu não sei se isso é uma boa ideia, mas pelo menos você deve ter muito cuidado se fizer isso.

    
por 03.05.2018 / 09:19