Почему команда printf в сценарии оболочки выдает ошибки

У меня есть скрипт, который отправляет мне некоторую информацию о разных машинах, и он отлично работает на машинах с Fedora, но Ubuntu 20.04 выдает ошибку только для одного printf. Кажется, я не вижу, что я делаю неправильно. Итак, утверждение:

      #printf "Last logins (last -10) \n `last -10` \n"
Last logins (last -10) 
bash: printf: ` ': invalid format character
 vecn1    pts/8        tmux(1233684).

тогда как аналогичные утверждения работают нормально:

      printf "Default gw (ip ro ls) \n`ip ro ls` \n"
Default gw (ip ro ls) 
default via 192.168.111.1 dev en0 proto dhcp src 192.168.111.6 metric 100 
192.168.111.0/24 dev en0 proto kernel scope link src 192.168.111.6 
192.168.111.1 dev en0 proto dhcp scope link src 192.168.111.6 metric 100 

Что я делаю не так? Может быть, эти цифры "%"? Не уверен, почему там. Обычно это просто имя хоста (ip). Если я простоlast -10следующий вывод

      vecn1    pts/8        tmux(1233684).%3 Mon Dec 26 11:29 - 12:01  (00:31)
vecn1    pts/7        tmux(1233684).%2 Mon Dec 26 11:29 - 12:01  (00:31)
vecn1    pts/6        tmux(1233684).%1 Mon Dec 26 11:29 - 12:01  (00:31)
vecn1    pts/5        tmux(1233684).%0 Mon Dec 26 11:29 - 11:29  (00:00)
vecn1    pts/8        tmux(1232989).%3 Mon Dec 26 11:27 - 11:29  (00:01)
vecn1    pts/7        tmux(1232989).%2 Mon Dec 26 11:27 - 11:29  (00:01)
vecn1    pts/6        tmux(1232989).%1 Mon Dec 26 11:27 - 11:29  (00:01)
vecn1    pts/5        tmux(1232989).%0 Mon Dec 26 11:27 - 11:27  (00:00)
vecn1    pts/8        tmux(1198190).%3 Mon Dec 26 11:03 - 11:04  (00:00)
vecn1    pts/7        tmux(1198190).%2 Mon Dec 26 11:03 - 11:04  (00:00)

wtmp begins Wed Jun 22 17:27:34 2022

Спасибо

1 ответ

Да это скорее всего%символы.

Всегда следует избегать внедрения кода в строку формата файлаprintfфункция; вместо этого передайте результат команды в качестве аргумента, используя соответствующий спецификатор формата (%sв случае строки):

      printf 'Last logins (last -10)\n%s\n' "`last -10`"

или лучше (избегая устаревшей формы подстановки команд с обратной кавычкой)

      printf 'Last logins (last -10)\n%s\n' "$(last -10)"
Другие вопросы по тегам