Вы не собираетесь быть способными изменить оболочку вызывающей стороны, потому что это находится в другом контексте процесса. Когда дочерние процессы наследовали переменные Вашей оболочки, они наследовали сами копии.
Одна вещь, которую можно сделать, состоит в том, чтобы записать сценарий, который испускает корректные команды для tcsh или sh, базирующегося, как это вызывается. Если Вы - сценарий, "setit", затем сделайте:
ln -s setit setit-sh
и
ln -s setit setit-csh
Теперь или непосредственно или в псевдониме, Вы делаете это от sh
eval `setit-sh`
или это от csh
eval `setit-csh`
setit использует 0$ для определения его выходного стиля.
Это является напоминающим о том, как люди используют для получения ТЕРМИНА переменная среды.
Преимущество здесь состоит в том, что setit просто записан в том, какой бы ни окружают Вас как как в:
#!/bin/bash
arg0=$0
arg0=${arg0##*/}
for nv in \
NAME1=VALUE1 \
NAME2=VALUE2
do
if [ x$arg0 = xsetit-sh ]; then
echo 'export '$nv' ;'
elif [ x$arg0 = xsetit-csh ]; then
echo 'setenv '${nv%%=*}' '${nv##*=}' ;'
fi
done
с символьными ссылками, данными выше, и оценка backquoted выражения, это имеет желаемый результат.
Упростить вызов для csh, tcsh, или подобные оболочки:
alias dosetit 'eval `setit-csh`'
или для sh, удара, и т.п.:
alias dosetit='eval `setit-sh`'
Одна хорошая вещь об этом состоит в том, что только необходимо вести список в одном месте. В теории Вы могли даже прикрепить список в файл и поместить cat nvpairfilename
между "в" и "делают".
Это в значительной степени, как раньше делались настройки терминала оболочки входа в систему: сценарий произвел бы statments, который будет выполняться в оболочке входа в систему. Псевдоним обычно использовался бы для создания вызова простым, как в "tset vt100". Как упомянуто в другом ответе, в сервере INN UseNet новостей существует также схожая функциональность.
Вы можете использовать обычные конструкции sql в синтаксисе ON DUPLICATE KEY . Таким образом, для выполнения условных обновлений во время вставки вы можете сделать следующее:
INSERT INTO tbl (hat, mittens, name)
VALUES ('yellow','purple','jimmy')
ON DUPLICATE KEY UPDATE name = CASE WHEN name <> VALUES(name)
THEN VALUES(name) ELSE name END;
Это изменит значение на то, что вы указали для оператора вставки, если оно отличается от того, что находится в строке, и установит значение, которое оно уже это если он не изменился и в результате MySQL ничего не сделает со строкой, сохраняя временную метку last_update, как указал Квассной.
Если вы хотите быть на 100% уверены, что вы не полагались на поведение MySQL, где он не обновляет строку, если вы устанавливаете значение для себя, вы можете сделать следующее, чтобы установить временную метку:
Вам нужен синтаксис INSERT ... ON DUPLICATE KEY UPDATE .
Ваш запрос будет выглядеть так:
INSERT INTO tbl (hat,mittens,name) VALUES ('blue','green','george')
ON DUPLICATE KEY UPDATE name='george';
Если бы у вас была запись с синим / зеленым / george for hat / mittens / name уже, ОБНОВЛЕНИЕ не будет выполнено, и ваша временная метка не будет обновлена. Если, однако, у вас есть запись с синим / зеленым / бетти, то «бетти» будет заменено на «джордж», и ваша временная метка будет обновлена.
Вам не нужно ничего делать, это поведение по умолчанию.
Если ваш запрос выбирает строку для UPDATE
, но обновленное значение остается таким же, как в:
UPDATE table
SET col = col
], отметка времени также остается прежней.
Эта строка даже не считается затронутой, запрос вернет 0 затронутых строк
.
Если вы выполняете несколько операций INSERT
(либо с помощью SELECT
, либо с помощью нескольких строк для VALUES
), вы можете сделать следующее:
INSERT INTO tbl (hat,mittens,name) VALUES
('yellow','purple','jimmy'),
('blue','green','george'),
('blue','green','betty')
ON DUPLICATE KEY UPDATE name = VALUES(name);
Это будет:
имя
для остальных (если новое значение отличается) Предостережение: комментарии в документации к ВКЛ Синтаксис DUPLICATE
говорит, что результат mysql_affected_rows ()
впоследствии ненадежен.