Подтвердить что ты не робот

То, что делает env в Bash?

Я получаю это поведение при использовании Bash (под Cygwin):

$ printf '\u00d5'
\u00d5
$ env printf '\u00d5' # This results in the behavior I want
Õ

Не имеет значения, использую ли я кодировку UTF-8 или ISO-8859-1 в терминале.

Мои вопросы: что делает env? Зачем мне это нужно в этом конкретном случае?

4b9b3361

Ответ 1

env не находится в bash, это автономный исполняемый файл, он используется для установки или очистки переменной среды перед запуском программы. В вашем конкретном случае он запускает двоичный printf вместо встроенной оболочки. Вы можете добиться того же результата, используя абсолютный путь:

/usr/bin/printf '\u00d5'

Наименее интрузивный метод, возможно, следующий: переопределите функцию printf и сохраните Bash остальные. Источник файла, который содержит следующее:

function printf()
{
  $(which printf) "[email protected]"
}

или как однострочный function printf() { $(which printf) "[email protected]"; }. Конечно, вы можете заменить $(which printf) на /usr/bin/printf...

Затем просто используйте printf, как вы привыкли. Ваш script остается прежним, и вы даже можете ввести условие для определения функции только для определенных версий Bash.

AFAIK вы также можете оставить function, но я считаю, что он добавляет читаемость.

[EDIT: ключевое слово function - расширение bash; printf () { ...; } - это синтаксис POSIX. Если вы используете ключевое слово function,() после имени функции являются необязательными.]


Как правило, env также используется в строках хеш-бэнга скриптов, которые стремятся быть переносимыми. Причина в том, что env почти всегда находится в /usr/bin/env, а bash не всегда находится в /bin/bash, как следует из многих строк хеширования. Пример:

#!/usr/bin/env bash

также работает для других программ/переводчиков:

#!/usr/bin/env python