Попробуйте сделать текущий идентификатор машины постоянным:
# mount --bind / /mnt
# cp /etc/machine-id /mnt/etc/machine-id
# reboot
Это должно избавить от монтирования tmpfs поверх / etc / machine-id
.
<
не является стандартным оператором дляtest
/[..]
(см. цитату ниже ). Кажется, поддерживается Bash, Dash, busybox и другими, но, видимо, не Zsh (. Я не уверен насчет разных версий Ksh ). Bash, ksh и Zsh также будут поддерживать[[ str1 < str2 ]]
(без необходимости выхода из<
). Вам нужно будет найти и использовать оболочку, которая поддерживает один из них.
(Обратите внимание, что Solaris 10 и более ранние версии даже имеют предварительный -POSIX /bin/sh
, но здесь это не имеет значения, так как он в любом случае не является стандартным.)
Some additional primaries newly invented or from the KornShell appeared in an early proposal as part of the conditional command ([[]]): s1 > s2, s1 < s2,... They were not carried forward into the test utility when the conditional command was removed from the shell because they have not been included in the test utility built into historical implementations of the sh utility.
Для работы в Solaris внесено несколько изменений -sh; вот мой подход:
#!/bin/sh
lag=00:06:00
MAX_LAG=00:05:00
IFS=:
set -f
set -- $lag
lagtotal=`expr 3600 * $1 + 60 * $2 + $3`
set -- $MAX_LAG
maxlag=`expr 3600 * $1 + 60 * $2 + $3`
if [ "$lagtotal" -lt "$maxlag" ]
then
echo "No LAG found."
else
echo "LAG more than $MAX_LAG was found."
fi
(заметьте, что сравнение строго меньше -, чем немного расходится с вашей формулировкой «LAG больше , чем...")
В последних системах Solaris[1] /bin/sh
равно ksh93
, поэтому следует выполнить следующее:
if [[ "$lag" < "$MAX_LAG" ]]; then..
Обратите внимание на двойные скобки [[.. ]]
; при использовании внутри [[.. ]]
оператор <
будет выполнять лексикографическое сравнение в ksh
, что должно выполняться дляHH:MM:SS
-подобных строк.
Если ваша оболочка действительно не поддерживает это, вы можете использовать большие пушки:
trim(){ ifs=IFS; IFS=:; v=$1; set -- $2; eval "$v=$1$2$3"; IFS=$ifs; }
trim a "$lag"
trim b "$MAX_LAG"
if [ "$a" -lt "$b" ]; then..
[1] /bin/sh
для Solaris — это ksh93
, так как Solaris 11 .
Any suggestions what needs to be changed in Solaris box?
Вы можете исправить свой сценарий с очень незначительным изменением. Просто измените шебанг, т.е. замените:
#!/bin/sh
по:
#!/bin/bash
и все. Вы используете башизм, так что просто оставайтесь с bash
, это оставляет меньше риска для других тонких несовместимостей, которые могут возникнуть в другой части скрипта; bash
был доступен в стандартных установках на протяжении десятилетий в Solaris.
Вы используете Solaris 10, который является довольно старым (первый выпуск в 2005 году ), и с ним /bin/sh
древняя оболочка (придерживается оригинального синтаксиса оболочки Bourne ), который по замыслу, чтобы не нарушать совместимость со старыми скриптами, не менялся с 1989 года (30 лет! ).
Текущая версия Solaris (Solaris 11 )использует оболочку POSIX как /bin/sh
, но она все еще не bash
, поэтому вам потребуется такое же исправление.
В наборе инструментов POSIX expr
и awk
можно использовать для сравнения строк.
Оба используют strcoll()
для сравнения (так же, какsort
:порядок сопоставления локали ), но вы можете установить локаль C, чтобы получить тип сравнения strcmp()
. Для вещей вроде HH :MM :SS это все равно не имеет значения.
if expr "$time1" '<' "$time2" > /dev/null; then
printf '%s\n' "$time1 was before $time2"
fi
Опять же, это не имеет значения для HH :MM :SS, но в общем случае обратите внимание, что expr
будет выполнять числовое сравнение, если операнды представляют собой десятичные целые числа, и сравнение строк в противном случае.. Это означает, что, например, 2
будет считаться меньшим, чем 10
, даже если strcmp()
или strcoll()
говорят об обратном.
Кроме того, expr
завершится ошибкой, если операнды являются expr
операторами:
$ x=+ y=-; expr "$x" '<' "$y"
expr: syntax error
Вы можете обойти обе проблемы, добавляя к операндам префиксы, которые не позволяют их воспринимать как числа или операторы:
expr "x $x" '<' "x $y"
Аналогичная проблема с awk
. Вам понадобится:
awk 'BEGIN{exit(!(""ARGV[1] < ""ARGV[2]))}' "$x" "$y"
Чтобы убедиться, что сравнение является сравнением строк, а не сравнением чисел.
Вы можете использовать вспомогательные функции, такие как:
compare() {
expr "x $1" "$2" "x $3"
}
или:
compare() {
awk 'BEGIN{exit(!(""ARGV[1] '"$2"' ""ARGV[2]))}' "$1" "$3"
}
И использовать как:
if compare "$time1" '<' "$time2"; then
printf '%s\n' "$time1 was before $time2"
fi
В любом случае, как всегда на Solaris, нужно убедиться, что /usr/xpg4/bin
стоит перед /bin
и /usr/bin
в $PATH
, иначе вы получите устаревшие не -стандартные утилиты. В частности, /bin/awk
в Solaris не будет работать с приведенным выше кодом. Это тот, что из 70-х без ARGV
.
По той же причине вы не хотите использовать #!/bin/sh
в своей -чёлке. Стандарт/POSIX sh
в Solaris — /usr/xpg4/bin/sh
(, хотя в Solaris 11 /bin/sh
изменен с оболочки Bourne на ksh93, что делает его намного более совместимым с POSIX; также обратите внимание, что /usr/xpg4/bin/sh
имеет много ошибок соответствия ).