Является ли «xargs -I s printf s» более совместимым, чем «xargs -n 1 printf»?

См. Ограничить поиск POSIX определенной глубиной? для стандартного эквивалента предиката GNU find's -maxdepth. Так вот:

(cd /Test && find. ! -name. -prune -type d -name '???') | sed 's|\./||'

Или, если установлено zsh:

zsh -c 'printf "%s\n" /Test/???(D/:t)'

3
14.03.2021, 15:39
1 ответ

xargs, вероятно, худшая утилита POSIX, когда речь идет о переносимости (и дизайне интерфейса ). Я бы держался подальше от этого. Как насчет:

<file.hex awk -v q="'" -v ORS= '
  BEGIN{
    for (i=0; i<256; i++) c[sprintf("%02x", i)] = sprintf("\\%o", i)
  }
  NR % 50 == 1 {print sep"printf "q; sep = q"\n"}
  {print c[$0]}
  END {if (sep) print q"\n"}
' | sh

вместо этого например?

Часть awkвыводит что-то вроде:

printf '\61\12\62\12\63\12\64\12\65\12\66\12\67\12\70\12\71\12\61\60\12\61\61\12\61\62\12\61\63\12\61\64\12\61\65\12\61\66\12\61\67\12\61\70\12\61\71\12\62\60'
printf '\12\62\61\12\62\62\12\62\63\12\62\64\12\62\65\12\62\66\12\62\67\12\62\70\12\62\71\12\63\60\12\63\61\12\63\62\12\63\63\12\63\64\12\63\65\12\63\66\12\63'
printf '\67\12\63\70\12\63\71\12\64\60\12\64\61\12\64\62\12\64\63\12\64\64\12\64\65\12\64\66\12\64\67\12\64\70\12\64\71\12\65\60\12\65\61\12\65\62\12\65\63\12'
printf '\65\64\12\65\65\12\65\66\12\65\67\12\65\70\12\65\71\12\66\60\12\66\61\12\66\62\12\66\63\12\66\64\12\66\65\12\66\66\12\66\67\12\66\70\12\66\71\12\67\60'
printf '\12\67\61\12\67\62\12\67\63\12\67\64\12\67\65\12\67\66\12\67\67\12\67\70\12\67\71\12\70\60\12\70\61\12\70\62\12\70\63\12\70\64\12\70\65\12\70\66\12\70'
printf '\67\12\70\70\12\70\71\12\71\60\12\71\61\12\71\62\12\71\63\12\71\64\12\71\65\12\71\66\12\71\67\12\71\70\12\71\71\12\61\60\60\12'

Для shинтерпретации. В реализациях sh, где printfвстроен, это не будет создавать дополнительные процессы. В тех случаях, когда это не так, эти строки должны быть более чем достаточно короткими, чтобы избежать ограничения ARG _MAX, но все же не запускать более одной printfна каждые 50 байтов.

Обратите внимание, что вы не можете реально определить максимальную длину командной строки, основываясь только на значении ARG _MAX. То, как этот предел достигается и обрабатывается, во многом зависит от системы и ее версии. На многих ARG _MAX находится на пределе совокупного размера, включая список указателей argv[]и envp[](, поэтому обычно 8 байт на аргумент/переменную в 64-битной системе )плюс размер каждая строка arg/env в байтах (, включая разделитель NUL ).Linux также имеет независимое ограничение на размер одного аргумента.

Также обратите внимание, что замена \12на \n, например, действительна только в системах на основе ASCII -. POSIX не определяет кодировку символов (, кроме NUL ). Все еще существуют системы POSIX, использующие некоторые варианты EBCDIC вместо ASCII.

6
18.03.2021, 22:28

Теги

Похожие вопросы