1

Это кажется таким простым при выполнении из командной строки, но я не могу выполнить это внутри скрипта. Я пытаюсь поместить вывод следующей команды в текстовый файл:

CMD= mysql -uroot -psecret -e 'SHOW SLAVE STATUS \G;'
FIL=~/replication-`date +%F`.txt
MAILTEXT=~/mailtext.txt

touch $FIL
$CMD > $FIL

Где FIL - это переменная, которая содержит путь к файлу, в который выводится команда. Я запускаю эту команду в сценарии оболочки, откуда я хочу отправить содержимое $FIL по электронной почте в виде вложения, используя mutt . Но я всегда получаю файл 0 байт. Также, если я проверю в каталоге, файл имеет длину 0 байт.

3 ответа3

3

Проблема не в перенаправлении, а в том, как вы храните команду в переменной. Во-первых, вы не можете поставить пробел после = в назначении; с пробелом он устанавливает CMD пустым и запускает команду mysql -uroot -psecret -e 'SHOW SLAVE STATUS \G;' , Если вы просто удалите пробел, он установит CMD на "mysql" и попытается выполнить команду -uroot -psecret -e 'SHOW SLAVE STATUS \G;' , Итак, как предложил @ Michał Šrajer, вы можете заключить его в двойные кавычки, чтобы все это было присвоено CMD. Но это все еще не работает, потому что, когда $CMD раскрывается, он не обращает внимания на кавычки внутри него. Когда bash анализирует командную строку, он анализирует кавычки перед тем, как развернуть переменные, поэтому помещение кавычек в переменную ничего полезного не дает.

Хранить команду в переменной сложно. BashFAQ # 50 имеет хорошие обсуждения и варианты. В этом случае варианты, которые выглядят важными для меня:

  1. Не помещайте команду в переменную в первую очередь. Если для этого нет веских причин, не делайте этого:

    FIL=~/replication-`date +%F`.txt
    MAILTEXT=~/mailtext.txt
    
    touch $FIL
    mysql -uroot -psecret -e 'SHOW SLAVE STATUS \G;' > $FIL
    
  2. Если вы должны поместить команду в переменную, используйте массив вместо простой текстовой переменной. В этом случае кавычки будут проанализированы, когда переменная будет создана, и если вы используете ее как "${varname[@]}" разрывы между "словами" будут сохранены:

    CMD=(mysql -uroot -psecret -e 'SHOW SLAVE STATUS \G;')
    FIL=~/replication-`date +%F`.txt
    MAILTEXT=~/mailtext.txt
    
    touch $FIL
    "${CMD[@]}" > $FIL
    
0

менять:

CMD= mysql -uroot -psecret -e 'SHOW SLAVE STATUS \G;'

чтобы:

CMD="mysql -uroot -psecret -e 'SHOW SLAVE STATUS \G;'"
0

Я создал похожий скрипт, который работает:

FIL=~/test.txt
CMD="hostname"
touch $FIL
$CMD > $FIL

Вы пробовали сначала без перенаправления, чтобы увидеть, генерируются ли вообще выходные данные?

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .