В чём отличие программы printf от команды printf?

Любые разговоры которые хоть как-то связаны с тематикой форума

Модератор: Модераторы разделов

MiK13
Сообщения: 1204
ОС: Linux Debian

В чём отличие программы printf от команды printf?

Сообщение MiK13 »

Случайно узнал, что в bash есть команда printf (хотя пользуюсь ей давно). До этого думал, что это программа из пакета coreutils.
Но я переименовал в каталоге /usr/bin программу printf в printf0, а команда printf всё равно работает.
И возник вопрос: есть ли между ними разница? По аналогии с разницей между командами time и программой /bin/time.
Спасибо сказали:
Аватара пользователя
algri14
Сообщения: 1369
ОС: Mageia 5.1 & 8 x86_64, KDE

Re: В чём отличие программы printf от команды printf?

Сообщение algri14 »

MiK13 писал:
08.07.2023 02:46
И возник вопрос: есть ли между ними разница? По аналогии с разницей между командами time и программой /bin/time.
синтаксис команды printf взят от функции printf() языка программирования Си (и еще дюжины других)
Printf как замена команды echo
интересный вопрос, из любопытства немного ознакомился с командой
зы: ОСТОРОЖНО, в моей ссылке, в конце статьи есть опасный пример команды — Опция -v ПЕРЕМЕННАЯ_ОКРУЖЕНИЯ (автор предупреждает)
или
Команда printf в Bash
ссылки из инета больше для меня самого (чтобы потом почитать)
Спасибо сказали:
Аватара пользователя
olecya
Сообщения: 901
ОС: debian, fedora (i3-wm)

Re: В чём отличие программы printf от команды printf?

Сообщение olecya »

Одна команда встроенная, одна внешняя из coreutils. По умолчанию вызывается встроенная, если она не отключена с помощью enable. Зачем переименовывать. Внешняя вызывается:

Код: Выделить всё

env printf
Встроенная:

Код: Выделить всё

builtin printf
или просто Посмотреть встроенные:

Код: Выделить всё

enable -p
compgen -b
Удостоверится какая программа вызывается:

Код: Выделить всё

strace -f -e trace=%process /bin/bash -c 'env printf ""'
strace -f -e trace=%process /bin/bash -c 'builtin printf ""'
strace -f -e trace=%process /bin/bash -c 'printf ""'
Две полностью независимые сборки программы, очень малый процент вероятности чтобы они оказались вдруг идентичными.
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20872
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: В чём отличие программы printf от команды printf?

Сообщение Bizdelnick »

MiK13 писал:
08.07.2023 02:46
И возник вопрос: есть ли между ними разница?
Очевидно, это разные реализации одной и той же стандартной команды. Информацию о различиях логично поискать в документации (man printf и man bash).
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
MiK13
Сообщения: 1204
ОС: Linux Debian

Re: В чём отличие программы printf от команды printf?

Сообщение MiK13 »

olecya писала:
08.07.2023 10:15
Одна команда встроенная, одна внешняя из coreutils.
Это я понял.
olecya писала:
08.07.2023 10:15
По умолчанию вызывается встроенная, если она не отключена с помощью enable. Зачем переименовывать. Внешняя вызывается:

Код: Выделить всё

env printf
Спасибо. Никогда не пользовался командой env. Это немного проще, чем набирать перед командой /bin/ или, тем более, /usr/bin/
olecya писала:
08.07.2023 10:15
Посмотреть встроенные:

Код: Выделить всё

enable -p
compgen -b
Посмотрел. И удивил один момент (не считая того, что их там оказалось больше 60):
Я увидел в списке команду [. Хотя есть программа /usr/bin/[
Но дело в том, что я когда-то прочитал, что вместо команды [ лучше использовать более продвинутую команду [[
И действительно, which [[ выдаёт пустую строку. Хотя bash [[ понимает.
Или это не команда, а просто элемент синтаксиса команды, например if?

Shell

mik13@md5:~$ [
bash: [: отсутствует символ «]»
mik13@md5:~$ [ ]
mik13@md5:~$ [[ ]]
bash: синтаксическая ошибка рядом с «]]»
mik13@md5:~$ [[
>
Спасибо сказали:
Аватара пользователя
ormorph
Сообщения: 2761
ОС: Gentoo

Re: В чём отличие программы printf от команды printf?

Сообщение ormorph »

MiK13 писал:
08.07.2023 15:41
Или это не команда, а просто элемент синтаксиса команды, например if?
Это элемент синтаксиса bash, двойные скобки позволяют использовать расширенный синтаксис, их можно использовать и без оператора if:

Shell

$ [ "Hello" = "Hello" ] ; echo $?

Shell

$ [[ "Hello" =~ ^H+.+o$ ]] ; echo $?

Shell

$ [[ "Hello" =~ ^H+[[:print:]]+o$ ]] ; echo $?
Спасибо сказали:
Аватара пользователя
olecya
Сообщения: 901
ОС: debian, fedora (i3-wm)

Re: В чём отличие программы printf от команды printf?

Сообщение olecya »

Shell

$ command -V [[
[[ is a shell keyword
command -V [
[ is a shell builtin
Справку по встроенным командам хорошо смотреть так:

Код: Выделить всё

help [[
help [
help test
help if
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20872
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: В чём отличие программы printf от команды printf?

Сообщение Bizdelnick »

MiK13 писал:
08.07.2023 15:41
Но дело в том, что я когда-то прочитал, что вместо команды [ лучше использовать более продвинутую команду [[
И действительно, which [[ выдаёт пустую строку. Хотя bash [[ понимает.
[[ — это не самостоятельная команда, а часть составной команды bash. О чём, опять-таки, можно прочитать в документации. И нет, её не лучше использовать, чем [. Они ведут себя по-разному, и надо выбирать ту или иную в зависимости от потребностей.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали: