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/kille a substituição do comando$(echo "75341 75342"), que é criada a partir do operador$(…)e dos tokensechoe75341 75342. - O comando no operador de substituição de comandos é executado. É um comando simples, com o nome do comando
echoe 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,IFScontém os caracteres space, tab e newline, portanto, a string é dividida em qualquer sequência desses caracteres: ela se torna a lista de duas strings75341e75342. A expansão do nome de arquivo não altera nada aqui. - Agora temos uma lista de três strings:
/bin/kill,75341e75342. Isso é executado como o comando/bin/killcom dois argumentos75341e75342.
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")