Exclui um único executável do PATH, sem chmod -x ele

1

Estou tentando remover um único executável de $ PATH, sem modificá-lo

Por exemplo, tenho /Users/USER/Library/Python/2.7/bin/ em $PATH e gostaria de excluir services.py desse diretório.

Eu sei que chmod -x services.py funcionará, mas estou tentando encontrar uma maneira melhor

É possível?

    
por daisy 12.03.2017 / 11:59

1 resposta

4

Se você puder mover o arquivo para um subdiretório que evitará sua execução.
Se você não puder, existem algumas soluções alternativas:

Você pode adicionar algo de uma prioridade mais alta para que seja executado antes do executável que você está tentando evitar.

Novo diretório no PATH.

Você pode criar um executável em um nível mais alto na ordem PATH.

Se $PATH for /usr/local/bin:/usr/bin:/bin , um executável (vazio?) em /usr/bin será executado com uma prioridade maior que um executável em /bin .

Nesse sentido, você pode adicionar um caminho no início de $PATH para garantir que o novo executável seja executado antes (em substituição a) services.py

Note que alguns shells lembram o caminho executado dos programas. No bash que é controlado pelo comando hash (um hash -r removerá todos os programas com hash). Um novo shell bash não possui programas com hash, exceto aqueles executados nos arquivos iniciais (geralmente ~/.bashrc e / ou ~/.profile ). Assim, um novo shell que tenha o novo PATH em vigor no início funcionará.

Se você não puder alterar o PATH ou mover o arquivo, poderá usar uma função ou definição de alias em ~/.bashrc ou algum outro arquivo de inicialização como ~/.profile .

Funções e aliases têm precedência mais alta que executáveis, então, nomear uma função (ou alias) como o executável irá efetivamente substituí-la em shells que tenham essa função definida.

função

Algo tão simples como isso será feito:

services.py(){ :; } # do nothing

Para testar, você pode definir ls para nada:

ls(){ :; }

Uma função pode ser apagada com unset -f FunctionName .

 $ unset -f ls

Para remover a função ls .

Note que uma função não é perfeita, o executável original pode ser chamado com o caminho completo:

$ /bin/ls
listOfFiles
…

Uma função impedirá que apenas "este shell" execute o programa. Qualquer outro shell (ou programa que possa chamar execve por si mesmo) executará o executável.

alias

Um alias é menos poderoso, apenas substitui a primeira palavra de um comando simples.
E se o comando tiver alguma forma de citar, ele evitará o alias.

$ alias ls='echo "none"'
$ ls
none
$ \ls
ListOfFiles
…

Um alias pode ser apagado com unalias AliasName . Então, isso:

 $ unalias ls

Removerá a definição de alias de ls .

O método mais robusto para alterar o PATH. Ou pré-pendente de um novo diretório ou movendo o arquivo para um novo diretório. Inclua esse diretório no $PATH apenas para as instâncias que terão permissão para executar o programa.

    
por 12.03.2017 / 17:14

Tags