Вот современный метод Linux:
ip -o link show dev eth0 | grep -Po 'ether \K[^ ]*'
Это современно в этом ifconfig
долго удерживался от использования в пользу ip
от iproute2
пакет и это grep
имеет -P
опция для регулярных выражений жемчуга для положительной нулевой ширины оглядывается утверждение.
grep -o
хорошо для извлечения текста. sed
традиционно используется для этого, но я нахожу утверждения нулевой ширины perl-стиля более ясными, чем sed команда замены.
Вам на самом деле не нужно -o
(короткая) опция к ip
, но я предпочитаю использовать его при извлечении информации о сети, так как я нахожу это инструментом для очистки, имеющим одну запись на строку. Если Вы делаете более сложные соответствия или извлечения (обычно с awk
), -o
важно для чистого сценария, таким образом, ради непротиворечивости и общего шаблона, я всегда использую его.
Было бы легче просто запуститься, программа непосредственно и иметь его сразу выполняет обновление (или это могло спать для некоторой маленькой задержки при реальной необходимости в нем к).
Если это находится в самом сценарии (например, удар), просто назовите сценарий обновления непосредственно (вероятно, перенаправляющий вывод):
update-my-thingy < /dev/null > /dev/null 2>&1
Если это находится в программе, можно всегда использовать систему (), звонят, чтобы сделать то же самое:
system("update-my-thingy < /dev/null > /dev/null 2>&1");
Разветвите сценарий, который ожидает в течение нескольких секунд.
{ sleep 5; update-my-program; } &
Если Ваша цель состоит в том, чтобы сделать обновление, как только Ваша программа выходит, но только, примите меры, чтобы Ваша программа завершилась путем вызова execve
вместо exit
. execve
системный вызов заменяет текущую программу другим. В C существует несколько вариантов (execl
, execp
, и т.д.) в зависимости от того, как Вы хотите передать параметры. В оболочке встроенное соответствие exec
.
Это зависит от того, что Вы программируете, делает. Для демонов это сделано следующий путь:
exec()
на сам для перезапуска программы с новым двоичным файломЭто хитро. Во-первых, только из предосторожности, помещает вызов в функцию в начале сценария и не называют его до конца:
% killmenow() { ... }
...
% killmenow
EOF
Это - лучший способ быть уверенным, что все из текущего сценария было полностью считано и скопировано в память. Просто высказывание.
Теперь для моей попытки ответа...
POSIX указывает jobs
утилиты для этих видов вещей. А именно, комбинация wait
, trap
, и kill
было бы самым безопасным, я думаю. Для получения вещей, проходящих максимально чисто, можно использовать newgrp
также, который является в точности как exec
в качествах наследования за исключением, как могло быть основным в этом случае, process id
.
Хорошо, таким образом, я знаю, что это походит на много, но это не так для взгляда на, в конце концов:
% suicide() { _me="${1}" ; (
>> trap 'wait "${_me}" && set -- &&\
>>> eval `newgrp && exec { YOUR | CMD | HERE }`' INT &&\
>> kill -s INT "-${_me}"
>> ) & }
...
% suicide "${$}"
Хорошо, таким образом, вот рабочий процесс:
- Сначала мы загружаем и запускаем весь скрипт, и мы уверены в этом, потому что мы не делаем
suicide
до самой последней строки.- Мы передаем
suicide
копия нашегоprocess id
затем сохраните его к$_me
, который мы могли столь же легко получить изsuicide
также в этом случае, но мы могли бы использовать его в другом месте, кто знает.- Из подоболочки мы звоним
trap
просканировать вtrapped
'$cmd'
и дайте этому команду быть в поисках любого слухаINT
звонить.- Уверенный все готово, наш вызов к
kill
наше самое последнее;kill
проблемыINTERRUPT SIGNAL
не только к$_me
но мы-
укажите это$_my
целая группа процесса должна получить его. Не бойтесь - если Ваша целая система не уже безумна -$_me
ничего не может уничтожить$_me
не должен мочь прямо сейчас так или иначе. Кроме того, Вы не имеете к-
укажите это вkill
PID
аргумент также; я просто пытаюсь быть полным.
Хорошо, но мы не сделаны, правильно? Нет, мы помещаем целый набор команд в a &
фоновая подоболочка так trap
все еще бродит вокруг и может поймать наш INT
звонить.
- Получив
INT
,trap
ТЕПЕРЬ оценивает'quoted argument'
- важно помнить, что что-либо в этой строке только теперь вытаскивается.- На всякий случай
$_me
имеет несколько других свободных концов для связывания в другом месте,trap
первые вызовыwait
на$_me
который будет оставаться на линии только столько, сколько она должна.- Когда готовый, мы вычищаем любого остающегося
env $vars
сset --
и затем мы приступаем к делу.
newgrp
разработан, чтобы быть выполненным в interactive shell
- который, как не обязательно предполагают, предоставлял процессу такой чистый Escape как это. На самом деле, если Ваша система group
потребуйте паролей - который они не были должны - это не работать на Вас и умрут теперь.
Я называю этот метод подлым ниже, но я выпрямил его из ИНСТРУКЦИЙ POSIX:
Общая реализация
newgrp
это текущее использование оболочкиexec
накладывать себя сnewgrp
, который в свою очередь накладывает себя с новой оболочкой после изменяющейся группы...
Затем в следующем абзаце...
Команда newgrp предназначается только для использования от интерактивного терминала. Это не предлагает полезный интерфейс для поддержки приложений.
Таким образом, подлая часть eval
, который может быть довольно хорош в такой вещи - как сохранение и многократное использование "$@"
например, но другое время, возможно...
- Вместо этого мы косвенно
eval
anewgrp && exec
оператор, что первые загрузки другой процесс, который, как только предполагается, принимает его следующее управление от интерактивной подсказки, затем мы украдкойexec
в черном ходе содержание{ YOUR | CMD }
.
К этому времени мы должны запускать новый скрипт в новой оболочке в новой группе процесса в чистой среде после необходимости ожидать только, пока было на самом деле необходимо и осуществить все это довольно полностью.
На самом деле мы были так полны, что мы могли безопасно сделать это:
...exec { wget -O - "${URL}" >"${0}" ; exec "${0}" }