Os argumentos para um utilitário são passados como uma lista de strings , não como uma única string. Portanto, o utilitário não tem noção de separador entre argumentos. Os argumentos são apenas elementos separados na lista, não há nada entre eles.
A entidade que divide uma string em uma lista de argumentos é o shell. O shell executa a linha de comando como /bin/kill $(echo "75341 75342")
executando uma série de expansões . Especificamente:
- O comando é dividido em tokens. Eu não vou entrar nessas regras em detalhes; um token é basicamente um sinal de pontuação ou uma sequência de caracteres que não contém espaços em branco de nível superior. Aqui, os tokens são a string
/bin/kill
e a substituição do comando$(echo "75341 75342")
, que é criada a partir do operador$(…)
e dos tokensecho
e75341 75342
. - O comando no operador de substituição de comandos é executado. É um comando simples, com o nome do comando
echo
e o único argumento75341 75342
. (As aspas fazem parte da sintaxe do shell, elas delimitam uma string, que se torna um argumento para o comando). - A saída do comando é
75341 75342
, em que
é um caractere de nova linha. O shell pega essa saída e remove as novas linhas finais, gerando a string75341 75342
. - Como o operador de substituição de comandos é usado em um contexto de lista (fora de aspas duplas), ele passa por divisão de palavras e expansão de nome de arquivo . A divisão de palavras consiste em pegar a string e dividi-la em uma lista de strings com base no valor da variável
IFS
. Por padrão,IFS
contém os caracteres space, tab e newline, portanto, a string é dividida em qualquer sequência desses caracteres: ela se torna a lista de duas strings75341
e75342
. A expansão do nome de arquivo não altera nada aqui. - Agora temos uma lista de três strings:
/bin/kill
,75341
e75342
. Isso é executado como o comando/bin/kill
com dois argumentos75341
e75342
.
Com o comando /bin/kill $(echo -e "75577\n75578")
, as expansões são praticamente as mesmas. O passo 3 produz a saída 7534175342
. Na etapa 4, a divisão de palavras produz a mesma lista 75341
, 75342
como antes, porque uma nova linha e um espaço são separadores de palavras igualmente válidos. Assim, o passo 5 executa exatamente o mesmo comando.
Como você pode ver, a etapa que determina o que separa os argumentos é a etapa de divisão de palavras executada pelo shell. Você pode experimentar essa etapa alterando o valor de IFS
. Por exemplo, isso produz novamente o mesmo comando:
IFS=+
/bin/kill $(echo "75341+75342")