Я работаю канавка некоторый унаследованный код, который не работает, я столкнулся с частью, которая вызывает проблемы. Я надеялся, что кто-то мог выручить меня и заполнить меня на том, что является точной функциональностью этой небольшой части сценария и что могло заставить это перестать работать/не, выполняются. Если я выполняю первый .sql файл на командной строке, все работает отлично, и я использую те же sql-логины в качестве сценария.
У меня есть update.sh файл, который выполняется каждую ночь и заботится об обновлении информации о клиенте. Как когда-либо, когда мы добавляем клиентов к файлу, где он считывает данные, ему не удается генерировать новую базу данных и экземпляры хранимой процедуры.
фрагмент кода:
#!/bin/bash
mysql_host="localhost"
mysql_id="root"
mysql_pwd="sudopwd"
read_dom () {
local IFS=\>
read -d \< ENTITY CONTENT
}
.
Some functioning code
.
.
Here is the part that does not work
sed -i "s/tk[0-9]*;/tk$company_id;/1i" resources/sql/create_tk.sql
mysql -h $mysql_host -u $mysql_id "-p$mysql_pwd" < resources/sql/create_tk.sql
sed -i "s/tk[0-9]*/tk$company_id/gi" resources/sql/load_data_tk.sql
mysql -h $mysql_host -u $mysql_id "-p$mysql_pwd"< resources/sql/load_data_tk.sql
fi
done < info.xml
EN_MO=$(date +%s)
DIFF_MO=$[$EN_MO-$ST_MO]
C_DATE=$(date +"%Y%m%d%H%M")
Если я понимаю правильно, что первая часть-i средства изменяет (база данных изменения, используемая в сценарии) create_tk.sql.
/s средства, что это сделано рекурсивно к каждой компании
/1i средства сохраняют tk [0-9] *;/tk$company_id; часть строки? и Вставьте содержание?
/gi что-то, чтобы сделать с хранением и пробелами шаблона? и Вставьте содержание?
Я ценил бы его действительно очень, если кто-то мог бы разъяснить точное значение этого отрывка и указать на то, что могло бы вызвать неспособность выполнить ее функцию.
Спасибо за справку все.
У меня есть update.sh файл, который выполняется каждую ночь
Я считал, что как "запускаю это через крон". Очень распространенная проблема, которую люди имеют с кроном, - то, что они делают ожидания о среде выполнениями сценария в. Они предполагают, что сценарий будет работать в их корневом каталоге.
Это точно, что Вы делаете. Все Ваш sed
команды используют относительные пути, таким образом, они работают, когда Вы находитесь в корректном каталоге... Но cron
в том же каталоге?Наверное, нет.
У Вас есть выбор мер здесь:
/home/bob/dir/file
cd
в правильный каталог (используют полный путь) наверху сценария.Сделайте свою команду крона cd
в корректный каталог перед работой, например:
00 00 * * * cd /home/bob && ./update.sh
На комментарии о полномочиях, если у Вас нет полномочий записи сделать оперативное sed
, Вы могли просто произвести к где-нибудь, где у Вас действительно есть полномочия записи, например:
sed "s/tk[0-9]*;/tk$company_id;/1i" resources/sql/create_tk.sql > $HOME/temp.sql
mysql -h $mysql_host -u $mysql_id "-p$mysql_pwd" < $HOME/temp.sql
rm $HOME/temp.sql#
Или Вы могли на самом деле просто передать по каналу от sed
в mysql
:
sed "s/tk[0-9]*;/tk$company_id;/1i" resources/sql/create_tk.sql \
| mysql -h $mysql_host -u $mysql_id "-p$mysql_pwd"
Эти подходы не изменят оригинал resources/sql/*.sql
файлы поэтому, если необходимо отредактировать их, необходимо устранить проблемы полномочий (независимо от того, что они; использовать stat filename
видеть, что продолжается),
@Oli сказал Вам, почему он, вероятно, перестал работать так, я просто объясню sed
код:
sed -i "s/tk[0-9]*;/tk$company_id;/1i"
s/PATTERN/REPLACEMENT/FLAGS
оператор замены. Это заменит PATTERN
с REPLACEMENT
. FLAGS
(например, g
в s///g
) может изменить его поведение. Здесь, флаги N
(1
в Вашем примере), что означает "Замену только Энное соответствие ШАБЛОНА (это странно, N
флаг обычно используется для замены Энного соответствия где N
больше затем 1. Я не вижу, почему это необходимо здесь, sed
заменит только первое соответствие по умолчанию). И i
который делает соответствие нечувствительным к регистру.
Ваша секунда sed
имеет флаги g
и i
. i
нечувствительное к регистру соответствие и g
делает замену глобальной, она будет применена ко всем соответствиям в текущей строке. Без него только было бы заменено первое, который является, почему я не вижу точку 1
флаг в предыдущем примере.
Вы не совершенно правы относительно значения sed опции. Позвольте мне сначала объяснить их затем, мы поймем то, что делает Ваш код.
Символы после последнего / являются модификаторами, они влияют, как sed обработает строки:
/gi и/1i являются комбинациями тех.
Таким образом в Вашем коде, этой строке:
sed -i "s/tk[0-9]*;/tk$company_id;/gi" resources/sql/create_tk.sql
перевел бы (чтение как одно предложение):
Источник: https://www.gnu.org/software/sed/manual/html_node/The-_0022s_0022-Command.html и страница справочника sed.