Команда `read` не работает в Makefile

Возможно, есть и другое наиболее быстрое решение. Этот код не учитывает наличие пробела в имени файла. Но вы можете попробовать следующий код:

SHW@SHW:/tmp # for i in `find /home/user -type f`
do
      mv $i `echo $i | cut -c -13`.`$i | rev | cut -d'.' -f 1 | rev`
done
4
12.11.2016, 01:31
2 ответа

Вы смешиваете оболочку и создаете там переменные. И , и , и оболочка используют $ для своих переменных.

В Makefile переменными являются $ (var) или $ v для однобуквенных переменных и $ var или $ {var}. в снарядах.

Но если вы напишете $ var в Makefile, make поймет его как $ (v) ar . Если вы хотите передать оболочке литерал $ , вам нужно ввести его как $$ , как в $$ var или $$ {var} , чтобы он стал $ var или $ {var} для оболочки.

Кроме того, make запускает sh , а не bash , чтобы интерпретировать этот код ( Edit , извините, пропустил ваш SHELL: = / bin / bash выше, обратите внимание, что во многих системах нет bash в / bin , если у них вообще есть bash и : = зависит от GNU), поэтому вам нужно использовать синтаксис sh . echo -n , read -s - это синтаксис zsh / bash , а не синтаксис sh .

Лучше всего для этого добавить сценарий zsh / bash (и добавить зависимость сборки от bash ). Что-то вроде:

#! /usr/bin/env bash
printf 'Welcome\nPlease enter the MySQL host (default: localhost): '
read host || exit
host=${host:-localhost}
printf "Please enter the MySQL username: "
read username || exit
printf "Please enter the MySQL password:"
IFS= read -rs password || exit
printf '\n'
mv includes/config.php.example includes/config.php 2>/dev/null
repl=${password//\\/\\\\}
repl=${repl//&/\\&}
repl=${repl//:/\\:}
{ rm includes/config.php && 
  sed 's/"USER", ""/"USER", "'"$username"'"/g
       s:"PASSWORD", "":"PASSWORD", "'"$repl"'"/g' > includes/config.php
} < includes/config.php || exit
mysql -u "$username" -p"$password" codeday-team < ./codeday-team.sql || exit

echo "Configuration complete. For further configuration options, check the config file"

Он решает еще несколько проблем:

  • вам понадобится -r при чтении пароля, если вы хотите разрешить пользователю использовать обратную косую черту в своем пароле.
  • вам понадобится IFS = , если вы хотите разрешить пользователю иметь пароль, который начинается или заканчивается пробелами.
  • То же самое применимо и к имени пользователя, но здесь мы предполагаем, что Пользователь не будет использовать ничего глупого для имени пользователя, а удаление пустых символов и обратную косую черту можно рассматривать как / feature /.
  • ваш ; true после mv не делает то, что вы думаете. Он не отменяет действие опции errexit (для реализаций make , которые вызывают оболочку с помощью -e ). Вместо этого вам понадобится || true .Здесь мы не используем errexit , а сами выполняем обработку ошибок с помощью || при необходимости выйдите из .
  • Вам нужно избежать обратной косой черты, & и разделителя s: pattern: repl: (здесь : ), иначе это не сработает (и может имеют неприятные побочные эффекты).
  • Вы не можете выполнить sed ... <файл> файл , поскольку файл будет усечен еще до запуска sed . Некоторые реализации sed поддерживают для этого параметр -i или -i '' . В качестве альтернативы вы можете использовать perl -pi . Здесь мы выполняем аналог perl -pi вручную (удаляем и воссоздаем входной файл после того, как он был открыт для чтения), но не заботясь о метаданных файла.

    Здесь было бы лучше использовать пример один как входной, а последний как выходной.

Он по-прежнему не решает еще несколько проблем:

  • новый config.php создается с разрешениями, полученными из текущей umask , которая, вероятно, будет ] доступен для чтения и принадлежит пользователю, выполняющему make . Возможно, вам потребуется адаптировать маску umask и / или сменить владельца, если каталог включает иным образом не ограничен, поскольку этот файл содержит конфиденциальную информацию.
  • , если пароль содержит " символов, это, скорее всего, сломается (на этот раз для php ).Вы бы хотели либо запретить их (возвращая ошибку), либо добавить еще один уровень экранирования для них в правильном синтаксисе для этого файла php . У вас, вероятно, будут аналогичные проблемы с обратной косой чертой, и вы также можете исключить символы, отличные от ascii, или управляющие символы.
  • Передача пароля в командной строке mysql , как правило, является плохой идеей, поскольку это означает, что он отображается в выводе команды ps -f . Было бы лучше использовать:

      mysql --defaults-file = <(
    printf '[client] \ nuser =% s \ npassword = "% s" \ n' "$ username" "$ пароль ") ... 
     

    printf встроен,он не будет отображаться в выводе ps .

  • переменная $ host не используется.

  • подобные подсказки пользователю означают, что ваш сценарий не может быть легко автоматизирован. Вместо этого вы можете использовать аргументы или (лучше пароль) переменные среды.
7
27.01.2020, 20:48

вы не используете никаких функций Makefile, вы пытались написать эти строки в одной оболочке?

затем в Makefile, который вы используете

    echo $username;\
    echo $password;\

make проанализирует $ username как $ u (пустая переменная) + sername (string)

попробуйте заменить $ username на $$ username , если вы хотите остаться в Makefile.

5
27.01.2020, 20:48

Теги

Похожие вопросы