É impossível ter bytes NUL em argumentos de linha de comando , então a questão é o que você quer que aconteça caso haja bytes NUL na entrada padrão.
Como você observou, sua solução candidata nº 1 executa o comando várias vezes neste caso. Isso não é ideal. Mas não há solução ideal que permita lidar com entradas binárias verdadeiras. Do meu ponto de vista, suas únicas outras opções razoáveis aqui são:
- elimine os bytes NUL e continue
- insira
tr -d '
antes dexargs
' |tr '
xargs
' something-else |
- insira
- traduza os bytes NUL para outra coisa e prossiga
- insira
something-else
antes detr '
(se %code% for um único byte)xargs
\n' '\nhead
' | head -n 1 | tr '%code%\n' '\n%code%'
- insira
-
aborte e solte no caso de existirem bytes NUL
-
com bash ou ksh93 (exceto se a entrada contiver um único byte nulo no final, caso em que ele é silenciosamente excluído):
{ read -r -d '' input; if [ "$(wc -c)" = 0 ]; then printf %s "$input" | xargs …; else echo 1>&2 "Null bytes detected, bailing out" exit 2 fi }
-
com zsh (e não com outros shells como bash, ksh ou dash):
input=$(<&0) if [[ $input != *$'
'* ]]; then printf %s "$input" | xargs …; else echo 1>&2 "Null bytes detected, bailing out" exit 2 fi{ read -r -d '' input; if [ "$(wc -c)" = 0 ]; then printf %s "$input" | xargs …; else echo 1>&2 "Null bytes detected, bailing out" exit 2 fi }
- Ou use um arquivo temporário.
-
-
trunca a entrada após o primeiro byte NUL
- insira %code% antes de %code% (supondo que seu %code% seja nulo)