Skip to content

Instantly share code, notes, and snippets.

@1234ru
Created January 22, 2019 19:01
Show Gist options
  • Save 1234ru/b5b02ffa30f02ea689e674a136845c3d to your computer and use it in GitHub Desktop.
Save 1234ru/b5b02ffa30f02ea689e674a136845c3d to your computer and use it in GitHub Desktop.
For FreeBSD 11.1
# Подсказки
# чтобы узнать код клавиши или их комбинации, нужно в терминале сначала нажать Ctrl+V; в полученном коде заменить ^[ на \e (Esc), а просто ^ - на \C- (Ctrl)
# bind -P - просмотр привязки имеющихся команд
# https://www.computerhope.com/unix/bash/bind.htm
cd s
export LANG="ru_RU.UTF-8"
# PS1="\[\e[93m\]dev> \[\e[0m\]"
# Управляющие последовательности для форматирования: https://misc.flogisoft.com/bash/tip_colors_and_formatting
# \e[93 - желтый, \e[97 - белый, \e[0m - сброс на цвет по умолчанию
# Непечатаемые последовательности нужно оборачивать в \[...\]
# см. https://unix.stackexchange.com/a/346093/230984
# Если этого не сделать, начинает глючить перемещение по командам: Ctrl+P (предыдущая), Ctrl+A (в начало строки) и др., если встретится команда, содержащая |
# Была попытка сделать вывод команды другим цветом.
# Раскрасить команду, а для вывода сбросить цвет к значению по умолчанию.
# См. https://unix.stackexchange.com/a/146148/230984
# Не сработала ни оригинальная команда, ни попытка изменить цвет таким же образом:
# trap '[[ -t 1 ]] && tput sgr0' DEBUG
# trap '[[ -t 1 ]] && tput setf 2' DEBUG
# Спросить не получилось, т.к. не хватает репутации для добавления комментария к ответу (нужно 50 очков).
set_prompt () {
base_path="/usr/local/www/virtual/watches-"
absolute_path=$(pwd -P)
relative_path=${absolute_path/$base_path/} # https://stackoverflow.com/a/13210909/589600
PS1="\[\e[93m\]dev: $relative_path> \[\e[0m\]"
}
PROMPT_COMMAND='set_prompt'
bind '"\e[A": history-search-backward' # пишем здесь, чтобы ради двух строчек
bind '"\e[B": history-search-forward' # не заводить .inputrc
#PRODUCTION_SERVER='main.watches.ru'
PRODUCTION_SERVER='213.133.103.216' # так быстрее работает ssh (почему-то на DNS-преобразование уходит несколько секунд времени)
alias ssh="ssh -p 9722"
alias sshw="ssh $PRODUCTION_SERVER"
alias scp="scp -P 9722"
alias scpms="scp -r -P 9722 main.watches.ru:~/site/"
alias fnd='grep -Rl --include="*.php" --include="*.tpl" --include="*.css" --include="*.js" --include="*.sh"'
alias fndl='grep -R --color --include="*.php" --include="*.tpl" --include="*.css" --include="*.js" --include="*.sh"'
alias upw="ssh $PRODUCTION_SERVER 'svn up ~/site'"
alias ngx="sudo /usr/local/etc/rc.d/nginx reload"
alias fsize="du -A -B 1 -h -d 0"
dbc () { # database copy (former dbcopy.sh)
if [[ $1 == "n" ]] # пробелы вокруг == важны!
then
db_remote="newwatches"
db_local=$db_remote
else
if [[ $1 == "s" ]]
then
db_remote="storage"
db_local=$db_remote
else
db_remote="-B storage newwatches"
db_local=""
fi
fi
if [[ $2 != "" ]]
then
tables=$2
else
tables=""
fi
# у ssh -p - порт, у scp -P - порт, -p - сохранить оригинальные время создания и права
# ssh -p 9722 $PRODUCTION_SERVER "'mysqldump -B $db > ~/$filename'"
# scp -P 9722 -p "$PRODUCTION_SERVER:~/$filename" ~/
# mysql < ~/$filename # --force нужен из-за CREATE ALGORITHM=UNDEFINED для VIEW, который требует административных прав
ssh -p 9722 $PRODUCTION_SERVER "mysqldump --skip-lock-tables $db_remote $tables" | mysql $db_local
if [[ $db_remote != "storage" ]]
then
mysql -e "UPDATE newwatches.shops SET email = '1234ru@gmail.com'"
mysql -e "INSERT IGNORE INTO newwatches.managers SET login = 'для теста', password = '72f511cde3f7fddba525694b9c661fb5', i = 'Для посмотреть', super = 1"
fi
}
rc () { # remote copying of files
# Функция для копирования файлов и каталогов с основного сервера с полным сохранением имени и пути
# 12.01.2019: на новых dev-площадках (d0.watches.ru и пр.) не работает, т.к. у них пути к каталогу веб-сервера не совпадают с таковыми на основном сервере.
# Принимает относительные пути (поэтому удобно использовать, например, находясь в каталоге "рядом" с требуемым файлом), но нужно, чтобы на сервере-источнике и сервере-приемнике они полностью совпадали.
# Нельзя поэтому, например, скопировать файл из main.watches.ru:/usr/.../newwatches/file.txt в dev.watches.ru:/.../watches-0/file.txt простой командной rc file.txt
# 27.12.2018: чтобы работали шаблоны (типа rc *.xls), в команду нужно добавить кавычки
# см. https://unix.stackexchange.com/a/67101
# Насчет статейки. Писать не стал, т.к.:
# - realpath не работает, только когда файл не существует; в остальных случаях она прекрасно подходит
# - отсутствие разворачивания символических ссылок - это, скорее, минус, а не плюс
# (если нужно сохранять путь только относительно домашнего каталога, можно так и написать сам скрипт; только чтобы он работал, нужно входить в дерево по символической ссылке в домашнем каталоге, чтобы pwd отражала путь через эту ссылку, а не реальный)
# ABSOLUTE_PATH=realpath "$1" - не работает, если файл еще не существует
# ВНИМАНИЕ! Не разворачивает символические ссылки.
## ABSOLUTE_PATH="$(cd "$(dirname "$1")"; pwd)/$(basename "$1")"
# Далее разбирается команда "$(cd "$(dirname "$1")"; pwd)/$(basename "$1")"
# (взято с http://stackoverflow.com/a/3915420/589600)
# 1. Аргумент заключаем в кавычки для корректной обработки пробелов и прочих символов, имеющих специальное значение, которые могут в нём встретится
TARGET="$1"
# 2. Получаем абсолютный путь к целевому каталогу
# (тут и скрыто самое замысловатое место)
# 2.1. Извлекаем путь к каталогу из указанного пути, будь то относительный или абсолютный.
RELATIVE_DIR="$(dirname $TARGET)"
# $(...) - подстановка вместо команды (command substitution) - означает "выполнить команду в скобках и поставить её результат (standard output) на место выражения $(...)
# dirname - встроенная команда UNIX-систем (стандарт POSIX.2), возвращает часть указанного пути файловой системы слева от последнего слэша (исключая его) или, если его нет, текущий каталог - "."
# Таким образом, в переменной RELATIVE_DIR окажется результат выполнения команды dirname.
# 2.2.
ABSOLUTE_DIR="$(cd $RELATIVE_DIR; pwd)"
# Выпонение команд в скобках $(...) вызывает открытие дочернего сеанса (subshell) и не влияет на состояние (текущий рабочий каталог и локальные переменные) сеанса родительского. Это иллюстрируется следующим примером:
# > A=1 # завели некоторую переменную
# > echo $A
# 1
# > bash # открыли дочерний сеанс оболочки
# > echo $A
# # результат - пустая строка, то есть изначально переменная родительской оболочки не видна
# > A=5
# > echo $A
# 5
# > exit # завершили дочерний сеанс
# > echo $A # теперь проверим, изменилось ли значение переменной в родительской оболочке
# 1 # значение осталось прежним
#
# Так же происходит и с текущим рабочим каталогом. Поэтому его смена внутри скобок - $(cd ...) - никак не отражается в других местах скрипта.
#
BASENAME="$(basename $TARGET)" #
ABSOLUTE_PATH="$ABSOLUTE_DIR/$BASENAME"
# А было так: "$(cd "$(dirname "$1")"; pwd)/$(basename "$1")"
scp -r -p -P 9722 $PRODUCTION_SERVER:$ABSOLUTE_PATH $ABSOLUTE_PATH
# -P - порт, -p - сохранить оригинальные время создания и права
# return
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment