Qual é a diferença se eu começar o bash com “/ bin / bash” ou “/ usr / bin / env bash”? [duplicado]

12

Nos scripts de shell, um especifica o interpretador de linguagem na linha shebang ( #! ). Até onde sei, é recomendado usar #!/usr/bin/env bash porque env está sempre localizado no diretório /usr/bin , enquanto a localização de bash pode variar de sistema para sistema. No entanto, existem diferenças técnicas se bash for iniciado diretamente com /bin/bash ou através de env utility? Além disso, estou correto que, se eu não especificar nenhuma variável para env , o bash será iniciado em um ambiente não modificado?

    
por Martin 29.05.2015 / 18:17

2 respostas

12

Em um sentido, usar env pode ser considerado "portátil" porque o caminho para bash não é relevante ( /bin/bash , /usr/bin/bash , /usr/local/bin/bash , ~/bin/bash ou qualquer caminho) porque é especificado no ambiente. Dessa forma, um autor de script poderia facilitar a execução de seu script em muitos sistemas diferentes.

Em outro sentido, usar env para localizar bash ou qualquer outro interpretador de shell ou de comando é considerado um risco de segurança, pois um binário desconhecido (malware) pode ser usado para executar o script. Nestes ambientes, e às vezes pela política gerencial, o caminho é especificado explicitamente com um caminho completo: #!/bin/bash .

Em geral, use env , a menos que você saiba que está escrevendo em um desses ambientes que analisa os mínimos detalhes de risco.

Quando o Ubuntu começou a usar dash , em 2011, muitos scripts foram quebrados por essa ação. Houve discussão sobre isso no askubuntu.com. A maioria dos scripts foi escrita em #!/bin/sh , que era um link para /bin/bash . O consenso foi este: o roteirista é responsável por especificar o intérprete. Portanto, se seu script sempre deve ser chamado com BASH, especifique-o no ambiente. Isso evita que você tenha que adivinhar o caminho, o que é diferente em vários sistemas Unix / Linux. Além disso, funcionará se amanhã /bin/sh se tornar um link para algum outro shell como /bin/newsh .

Outra diferença é que o método env não permite a passagem de argumentos para o interpretador.

    
por 29.05.2015 / 19:30
3

Além disso, usando /usr/bin/env é um pouco mais lento, não há diferença, se você iniciar um programa que tal shebang. (A menos que /bin/bash não exista, mas bash é em algum lugar (else) no PATH)

env tem a possibilidade de modificar o ambiente do comando invocado, mas que só pode ser usado quando env é iniciado a partir da linha de comando, com a linha shebang (dependendo do sistema operacional) as opções não podem ser especificadas.

O source of env é bastante pequeno para que você possa verificar o que está fazendo se estiver familiarizado com C. Como execvp é usado para chamar o programa a ser executado. Não haverá nem mesmo um processo env pai se você inspecionar a árvore de processos.

    
por 29.05.2015 / 18:46