Por que o diretório env é chamado antes de echo?

4

Estou a ver um programa codificado em C. O problema deste programa baseia-se nesta linha de código.

system("/usr/bin/env echo and now what?");

Eu entendo que o sistema () apenas executa o comando. Mas eu não sei ao certo por que é assim.

Normalmente, seria apenas "eco e agora". Mas por que isso é "usr / bin / env" colocado na frente dele? O que exatamente isso está fazendo?

    
por sqlsqlsql 12.05.2017 / 00:19

2 respostas

2

/usr/bin/env seguido do nome de um programa executa esse programa. Ele procura o nome do programa como um arquivo executável nos diretórios configurados pela variável de ambiente PATH . É um caso especial do uso de env : env é seguido por algumas atribuições de variáveis de ambiente e, em seguida, um nome de programa e argumentos - aqui acontece de haver zero atribuições de variáveis.

/usr/bin/env echo … é equivalente a /bin/echo … , exceto pelo fato de não codificar o caminho para echo - dependendo do sistema e do valor de PATH , pode ser /bin/echo , /usr/bin/echo , /usr/xpg4/echo , /usr/ucb/echo , /usr/local/bin/echo , /home/bob/bin/echo ,…

Quase todo shell tem um comando echo embutido. Pode haver diferenças de comportamento entre o shell embutido e o comando externo. Na prática, há variações entre os comandos echo em dois aspectos: o que acontece se o primeiro argumento começar com - (algumas versões de echo processam algumas opções) e como uma barra invertida é processada (algumas versões imprimem literalmente, outros o tratam como um personagem de escape). Portanto, forçar uma versão de echo é útil ocasionalmente, quando você deseja usar esse comportamento dependente da implementação. Na maioria dos casos, é melhor usar printf - printf pode fazer tudo o que o echo pode fazer e é portátil, exceto para antiguidades.

Com os argumentos passados em seu código de exemplo, a escolha de uma implementação de eco não importa. Se houver um ponto para essa loucura, seria necessário muito mais contexto para descobrir.

    
por 12.05.2017 / 02:49
1

I understand that the system() just runs the command.

Correto.

Normally it would just be "echo and now what".

Você está perdendo o último caractere.

But why is that "/usr/bin/env" put in front of it?

Esse é o caminho completo do comando env , que é o comando executado em vez de echo .

What exactly is that doing?

Ele impede que o echo builtin seja executado pelo shell gerado pela função system libc , de modo que o executável echo encontrado pela primeira vez no PATH seja usado. Dependendo das respectivas implementações de echo , o comportamento pode ser diferente, embora eu não veja nada de especial. Em ambos os casos, "e agora o que?" deve ser impresso, a menos que você tenha azar e tenha um arquivo cujo nome de cinco letras comece com "what", como por exemplo "whatz" em seu diretório atual. Se for o caso, o que seria impresso é:

and now whatz

    
por 12.05.2017 / 02:28