С GNUsed
:
dig @1.1.1.1 google.com +noall +answer +stats | \
sed -nEz 's/.*[[:space:]]([0-9.]+)\n;; (Query time[^\n]*\n).*/\1 \2/p'
С опцией sed
и -z
ввод обрабатывается как одна большая строка, а опция -n
печатает только совпадающие части(/p
). Поскольку за IP-адресом сразу же следует новая строка и ;; Query time
, мы можем использовать более простое регулярное выражение для сопоставления с IP-адресом. Обе строки захватываются в группу (…)
, а ввод заменяется на \1 \2
, относящимся к этим группам.
На каком-то этапе вам потребуется получить информацию из удаленного репозитория. В настоящий момент вы используете git pull
для загрузки информации и ее слияния. Вы должны разделить это на 2 шага, сначала загрузите информацию о состоянии удаленного репо. В качестве второго шага посмотрите, достигли ли вы даты -до -, если нет, то объедините данные, сделайте очистку и сделайте.
Как сообщает вам git pull --help
, он запускает git fetch
, а затем либо git rebase
, либо git merge
.
Если вы знаете имя локальной ветки и ветки, которую она отслеживает, вы можете использовать низкоуровневую команду git show-ref
, чтобы получить хеш-значения и проверить, равны ли они. Это работает, только если вы точно отслеживаете восходящую ветку, но очень дешево.
same_commit(){
set -- $(git show-ref --hash --verify "$@")
[ "$1" = "$2" ]
}
# get the changes if any, but don't merge them yet
git fetch origin
# See if there are any changes
if same_commit mainline origin/mainline
then
echo "Everything up to date"
exit 0
fi
# Now merge the remote changes
git pull origin
make clean
make
Если у вас также есть локальные изменения, вам нужно посмотреть, есть ли в вашей локальной ветке все восходящие потоки.
contains(){
# return true if the first name has the second as an ancestor
git merge-base --is-ancestor "$2" "$1"
}
if contains master origin/master
then
echo nothing to do
return 0
fi