3

Мне интересно, какое поведение следует команде printf при использовании подстановочных знаков. Этот вопрос первоначально задавался мне кем-то другим, но я сам смущен поведением и хотел бы получить объяснение, которое поможет мне понять, как работает команда printf .

Учитывая следующий каталог:

$ ls -a  
.a  a.b  ab.c  b  .b  b.a  b.c  c  c.d  d  d.e  e

$ printf [abcd]*[abcd] выведет a.b . $ ls [abcd]*[abcd] дает

a.b:    

ab.c:    

b.a:      

b.c:      

c.d:   
    

в качестве вывода, и $ echo [abcd]*[abcd] приводит к a.b ab.c b.a b.c c.d

Почему у printf другой вывод? Это связано с приоритетами расширения регулярных выражений / оболочки?

1 ответ1

3

Используйте set -x чтобы увидеть, что на самом деле представляет команда после ее расширения. Оказывается

printf [abcd]*[abcd]

в вашем каталоге на самом деле

printf a.b ab.c b.a b.c c.d

Теперь printf обрабатывает a.b как FORMAT (см. man 1 printf). Он не включает в себя %s и ничего подобного, поэтому остальные аргументы не имеют значения, и печатается буквально a.b .

Если вы хотите, чтобы printf вел себя больше как echo , вы должны указать желаемый формат, например:

printf '%s\n' [abcd]*[abcd]

распечатает

a.b
ab.c
b.a
b.c
c.d

(Примечание: используйте set +x чтобы вернуть set -x после завершения теста.)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .