Выполнение команды alias string

Используйте date +%sдля получения метки времени UNIX, например 1524388823. В отличие от даты, зависящей от локали, -удобочитаемой для человека даты, ее легче сравнивать в сценарии.

На машинах с правильной синхронизацией времени что-то вроде этого должно работать:

a=$(date +%s)
b=$(ssh user@remote date +%s)
c=$(date +%s)

if [ $a -le $b  -a  $b -le $c ]
then
    echo Seems to be OK.
fi
  • (a)— местное время до SSH,
  • (b)— удаленное время,
  • (c)— местное время после SSH.

Если (a <= b <= c)разумно предположить, что время синхронизировано. Это вообще не принимает во внимание задержку сети -проверьте дельту (a,c )для этого -, но все же это должно быть разумным. Предполагая, что SSH не будет запрашивать пароль и/или вы не будете тратить весь день на его ввод.

Если вы все еще хотите добавить к этому 5 секунд, используйте -5 и c+5. Конечно, это дает 5 секунд в любом направлении -и не считается 5-секундным окном для всех машин. Но если вы на самом деле не выполняете миссию в дальнем космосе, как предполагают ваши имена хостов, в первую очередь нет причин принимать такое огромное расхождение во времени.

Если вы используете NTP постоянно, а не раз в год, все машины должны быть идеально синхронизированы, несмотря ни на что, и большую часть времени мы просто слепо предполагаем, что это так, и даже не проверяем.

0
09.04.2020, 14:40
2 ответа

У вас две проблемы:

  1. Сложно запустить команду, хранящуюся в переменной. Но на самом деле вам не нужно хранить команду в переменной. Вы можете просто выполнить alias "${cur_dir}"="code $d"там, где вы запускаете $cmd.

  2. Вы используете aliasв подоболочке. Bash запускает конвейерные команды в подоболочке (, если lastpipeне установлен ). Но вам не нужна труба (или findили ). Вы можете просто использовать обычное подстановочное значение (, которое вы уже используете, поэтому findимеет еще меньше смысла ).

Комбинированный:

shopt -s dotglob
for d in ~/development/*/; do         # trailing slash - only directories match
    cur_dir="${d%/}"                  # strip trailing slash
    cur_dir="${cur_dir##*/}"
    alias "${cur_dir}"="code $d"
done
3
28.04.2021, 23:18

Прочитав все комментарии, исправил свой скрипт вот так:

shopt -s dotglob #Use shopt -u dotglob to exclude hidden directories
while IFS= read -r d; do 
    cur_dir="${d##*/}"
    #echo "${cur_dir}"="code $d"
    alias "${cur_dir}"="code $d"
done <<<$(find ~/development/* -prune -type d)
0
28.04.2021, 23:18

Теги

Похожие вопросы