Am I correct that xargs runs command in several run, each of which with different sequence of arguments?
Sim (a menos que a entrada para xargs seja repetida, é claro)
mycommand arg1 arg2 arg3must be effectively the same as
mycommand arg1 mycommand arg2 arg3
Praticamente, já que, em geral, não podemos saber onde xargs irá dividir a lista. GNU xargs tem --show-limits que pode ser usado para determinar se todas as entradas se encaixam em uma execução do comando.
É claro que se os argumentos devem ser passados para o comando em conjuntos de N , podemos usar -n N para ter algum controle sobre ele (ou -n M com M alguns múltiplos de N ).
Is there any command which doesn't satisfy the above condition? (I can't find any.) If there is, can it be run by xargs?
Kusalananda mencionou mv , que tem a questão de que o último argumento é tratado de forma diferente dos outros. Com efeito, os argumentos adicionados por xargs precisariam ir para o meio e não há uma maneira padrão de fazer isso. (O FreeBSD xargs tem -J {} que faz isso e o GNU mv tem a opção -t dir para passar o diretório de destino no início da lista de argumentos. cp é similar.)
Então, algo como tar -czf foo.tar.gz não funcionaria, pois -c (create) sobrescreve o arquivo em cada execução. Isso poderia ser evitado usando -r (append) em vez de -c , mas pelo menos o tar do GNU não suporta anexar a um archive compactado.
Felizmente, a maioria dos utilitários trabalha arquivo por arquivo e foi projetada para aceitar uma lista de arquivos no final.
Can the arguments passed by xargs to command be any kind of arguments: options, option arguments, or nonoption arguments?
Eles são apenas strings, xargs não sabe o que eles significam. Se você tivesse um utilitário que não aceitasse a lista usual de arquivos, mas aceitasse uma opção -f filename , você poderia organizar o xargs para obter entradas como -f file1 -f file2 ... e seria muito bom passar adiante. Embora com muita entrada, o limite de tamanho poderia causar novamente uma divisão entre um -f e um nome de arquivo, mas adicionar algo como -n 100 tornaria isso improvável (dependendo do tamanho dos arquivos e do limite de tamanho real). / p>
What if -i of xargs is involved?
-i no GNU xargs é o mesmo que -I {} , e de forma um tanto enfadonha torna xargs executar o comando uma vez para cada argumento de entrada. Ajuda se você precisar colocar o argumento no meio do comando, mas realmente não ajuda a reduzir o número de invocações para o comando.