Вы обновили libc (самую простую системную библиотеку ), и теперь ни одна программа не работает. Если быть точным, ни одна динамически подключаемая программа не работает.
В вашем конкретном случае перезагрузка должна помочь. Для установленной сейчас -libc требуется более новое ядро, и если вы перезагрузитесь, вы получите это более новое ядро.
Пока у вас все еще есть работающая оболочка, часто существует способ восстановления, но это может быть сложно, если вы этого не планировали. Если у вас нет оболочки, то обычно нет другого решения, кроме перезагрузки.
Здесь вы, возможно, не сможете восстановиться без перезагрузки, но вы, по крайней мере, сможете легко узнать, какое ядро запущено. Просто используйте способ чтения /proc/version
, который не требует внешней команды.
read v
Если у вас все еще есть копия старой libc, вы можете запускать программы с ее помощью. Например, если старая libc находится в /old/lib
и у вас есть исполняемые файлы, которые работают с этой старой libc в /old/bin
, вы можете запустить
LD_LIBRARY_PATH=/old/lib /old/lib/ld-linux.so.2 /old/bin/uname
Если у вас есть статически связанные двоичные файлы, они все равно будут работать. Я рекомендую установить статистически связанные системные утилиты для такого рода проблем (, но вы должны сделать это до того, как проблема начнется ). Например, в Debian/Ubuntu/Mint/… установите один или несколько из busybox -static(набора основных инструментов командной строки Linux, включая оболочку ), sash(оболочку. с некоторыми дополнительными встроенными модулями ), zsh -static(просто оболочка, но с несколькими встроенными удобными инструментами ).
busybox-static uname
sash -c '-cat /proc/version'
zsh-static -c '
Чтобы проверить, является ли аргумент скрипта 1
или 2
, вы можете просто использовать оператор case.
В приведенном ниже коде предполагается, что вы хотите проверить$1
:
case $1 in
[12])
# $1 is 1 or 2
;;
*)
# $1 is not 1 and not 2
esac
Нет реальной необходимости проверять, является ли аргумент допустимым целым числом или нет, так как вас интересуют только два конкретных значения, и их можно легко проверить как строки. Значения переменных оболочки всегда являются строками, если они не используются в арифметическом контексте, и здесь нет причин делать это.
Вы также можете использовать явный оператор if
:
if [ "$1" = '1' ] || [ "$1" = '2' ]; then
# $1 is 1 or 2
else
# $1 is not 1 and not 2
fi
Проверьте приведенную ниже ссылку, чтобы убедиться, что значение аргумента является целым числом.
https://stackoverflow.com/questions/2210349/test-whether-string-is-a-valid-integer
и чтобы проверить отсутствие переменной, скажем, вы присваиваете свой первый аргумент переменной
var=$1
if [ ! -z "$var" ]; then
echo "value is present"
else
echo "value is not present"
fi