envsubst: команду не знайдено в Mac OS X 10.8


92

Коли я намагаюся запустити сценарій, що містить команду envsubst, я отримую цю помилку. Дивлячись в Інтернеті, це здається стандартною командою bash, тому я не впевнений, що встановлювати, щоб змусити її працювати.


2
envsubstвходить в gettextкомплект. Ви можете скомпілювати самостійно. см stackoverflow.com/questions/14940383 / ...
ymonad

Хочете додати це як відповідь, щоб я міг її прийняти?
Ендрю

Я розмістив це як відповідь.
ymonad

Відповіді:


131

Редагувати: відповідь @cobberboy правильніша. підтримати його.

brew install gettext
brew link --force gettext 

Ось моя стара відповідь:

envsubst входить до gettext комплект.

Тому ви можете скомпілювати його самостійно, використовуючи стандартні інструменти побудови, такі як makeабо за допомогоюhomebrew .

Однак, схоже, у нього мало проблем при встановленні gettextв MacOS. Дивіться наступну URL-адресу для деталей: Як встановити gettext на MacOS X


8
Хоча envsubstє частиною gettext (як встановлено homebrew), він не пов’язаний за замовчуванням. Я сподіваюся, що це тому, що gettext - це формула, що містить лише кеґ. Ви можете сказати homebrew пов’язати бочку, але це може мати небажані побічні ефекти. Менш нав'язливим підходом є встановлення псевдоніма шляхом додавання alias envsubst='/usr/local/Cellar/gettext/0.19.6/bin/envsubst'до вашого .profile(або еквівалента). Звичайно, у вас може бути встановлена ​​інша версія gettext. Ви можете дізнатися про це, запустивши brew info gettext.
trkoch

2
@trkoch Ви, мабуть, хочете псевдонім, /usr/local/opt/gettext/bin/envsubstякий переживає оновлення
Крістоф Хеслер

1
Хоча це прийнята відповідь, прокрутіть униз до відповіді @ cobberboy, оскільки також часто зустрічається, що вам потрібно примусити посилання.
Великі гроші

Я дивувався, чому я раптом отримую більше голосів. Дякую за вашу щедрість @ymonad
cobberboy

1
Посилання /usr/local/Cellar/gettext/0.19.8.1 ... 194 створені символічні посилання ... wtf 194 символічні посилання?
Олександр Міллс

235
brew install gettext
brew link --force gettext 

Це дозволить envsubst в OS X і змусить його правильно зв’язуватись. Для цього потрібно встановити доморощену мову.


1
Linking /usr/local/Cellar/gettext/0.19.8.1... 194 symlinks created... символічні посилання wtf 194?
Олександр Міллс

@AlexanderMills так, gettextвключає в себе надзвичайно багато речей; здається надмірним, щоб просто envsubstвстановити, але це найшвидший і найпростіший спосіб.
cobberboy

здається, вони зв’язують кожен файл, а не просто зв’язують папку
Олександр Міллс,

17

Щоб усунути потенційну плутанину:

  • envsubstє зовнішнім виконуваним файлом і, отже, не є частиною Bash ; зовнішні виконувані файли залежать від платформи як з точки зору того, які з них доступні, так і з точки зору їхньої конкретної поведінки та конкретних параметрів, які вони підтримують (хоча, сподіваємось, існує загальна підмножина на основі специфікацій POSIX)
  • Команди, вбудовані безпосередньо bash, називаються вбудованими , і лише на них можна покластися, щоб вони були присутніми на всіх платформах .

Щоб перевірити, чи є дана команда вбудованою , використовуйте

type <cmdName>

У type envsubstнаведеному випадку запуск на macOS 10.13 повертається -bash: type: envsubst: not found, з чого можна зробити висновок:

  • envsubst НЕ є вбудованим
  • envsubstвідсутній у вашій системі $PATH(і, отже, відсутній у вашій системі)

(Навпаки, те саме виконувати за командою, наприклад, повертається система Ubuntu 12.04 envsubst is hashed (/usr/bin/envsubst), яка повідомляє, що утиліта присутня і де вона знаходиться.)


Імпровізованою альтернативою envsubstє використання eval, хоча застосовується звичайне застереження: використанняeval лише для рядків, вмістом яких ви керуєте чи довіряєте:

Припустимо sample.txtфайл, що містить текст із розгорнутими посиланнями на змінні; наприклад:

cat > sample.txt <<'EOF'
Honey, I'm $USER
and I'm $HOME.
EOF

Еквівалент:

envsubst < sample.txt

це:

eval "echo \"$(sed 's/"/\\"/g' sample.txt)\""

Однак є суттєва різниця :

  • envsubstрозширює лише посилання на змінні середовища
  • в той час як evalбуде розширюватися оболонками посилання змінної теж - а також вбудовані команди заміна , яка є те , що робить використання evalв проблемі безпеки.

Мені подобається ідея, eval echoтому що я довіряю джерелу, але це не те саме .. envsubst < .env.exampleне може бути простоeval echo < .env.example
iRaS

1

Зараз я використовую це у своєму скрипті bash, який вимагає envsubst:

if ! which envsubst > /dev/null 2>&1; then
    envsubst() {
        while read line; do
            line=$( echo $line | sed 's/"/\\"/g' )
            eval echo $line
        done
    }
fi

Ви можете використовувати його як команду envsubst - звичайно, це не повноцінна функція чи щось інше:

envsubst <<<'Honey, I am $HOME.'
envsubst < input > output 2> corrupt

Здається, це позбавляє всіх пробілів, що ведуть і відстають
Судо

як сказано, це обхідний шлях, який не є повноцінним. ви можете спробувати додати "близько $ рядка, але я ще не пробував це
iRaS

1

Якщо ви не хочете турбуватися про встановлення homebrew та gettext, виконуватиметься виконуваний файл perl в один рядок:

#!/usr/bin/perl -p
$_ =~ s/\Q${$1||$2}/$ENV{$1?$2:$4}/ while $_ =~ /(\$\{([^}]+)})|(\$(\w+))/g;
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.