Проверьте, содержит ли переменная shell абсолютный путь

У вас две проблемы. Первая - вы пытаетесь установить mariadb RPM, который конфликтует с тем, что есть в базовых пакетах CentOS/RHEL. Вторая - вы используете команду rpm.

Что касается первой проблемы, то поскольку вы не работаете в интернете с этой машиной, то это не проблема. Но если вам удастся подключить машину к интернету, то у вас могут возникнуть проблемы с обновлениями yum. Так что будьте осторожны.

Что касается второй проблемы, не используйте команду rpm, даже если это всего лишь один RPM. Вы всегда должны использовать yum. Вы можете устанавливать rpm непосредственно из yum. Примеры ниже.

# yum install --disablerepo=* openfire-4.0.2-1.i386.rpm -y
## Or in your case...
# yum install --disablerepo=* MariaDB*.rpm -y
3
20.01.2016, 02:57
7 ответов

Вы можете просто сделать:

case $1 in (/*) pathchk -- "$1";; (*) ! : ;; esac

Этого должно быть достаточно. И он запишет диагностику в stderr и вернет ошибку для недоступных или несоздаваемых компонентов. pathchk не о существующих путевых именах - это о используемых путевых именах.

Утилита pathchk должна проверять, что один или несколько путей действительны (то есть, они могут использоваться для доступа или создания файла, не вызывая синтаксических ошибок) и переносимая ] (то есть без результата усечения имени файла) . Опция -p предоставляет более обширные проверки переносимости.

По умолчанию утилита pathchk проверяет каждый компонент каждого операнда pathname на основе базовой файловой системы. Диагностика должна быть написана для каждого операнда pathname , который:

  • длиннее, чем {PATH_MAX} байтов (см. Значения переменных Pathname в )

  • Содержит любой компонент, длина которого превышает {NAME_MAX} байтов в его содержащем каталоге

  • Содержит любой компонент в каталоге, который недоступен для поиска

  • Содержит любой символ в любом компоненте, который недействителен в содержащем его каталоге

Формат диагностического сообщения не указан, но должен указывать обнаруженную ошибку и соответствующий операнд пути .

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

6
27.01.2020, 21:07

Если под абсолютный путь вы имеете в виду, что он начинается с / , и мы говорим о bash (как предлагает тег):

$ var1='/tmp/foo'
$ var2='tmp/foo'

$ [[ "$var1" =~ ^/ ]] && echo yes || echo no
yes
$ [[ "$var2" =~ ^/ ]] && echo yes || echo no
no
2
27.01.2020, 21:07

Просто проверьте первый символ строки, используя синтаксис подстроки:

[[ ${var:0:1} = / ]] || return 1
1
27.01.2020, 21:07

POSIX определяет абсолютный путь как имя пути, начинающееся с одного или более двух /.

Существует утилита pathchk для проверки пути, так что вы можете сделать:

[ -z "${1%%/*}" ] && pathchk -pP "$1"

-p указывает pathchk выполнить проверку пути, который:

-.... P защищает вас от любого компонента пути, начинающегося с - и пустого пути.

1
27.01.2020, 21:07

Согласование шаблонов выполняется с помощью операторов case во всех Bourne-подобных оболочках.

is_absolute() {
  case "$1" in
    ///* | //) true;;
          //*) false;; # on some systems, //foo is special and is
                       # not an absolute path. // alone is /
           /*) true;;
            *) false
  esac
}

Удалите первые две записи в системах, которые не обрабатывают //foo специальным образом.

3
27.01.2020, 21:07
[ "$1" != "${1#/}" ] || return 1

Возможно, есть лучший способ (поэтому я и спросил). Этот код отсекает все ведущие / в $1 и проверяет, что результат не такой же, как $1.

6
27.01.2020, 21:07

Абсолютный путь

  • должен начинаться с /
  • не содержать никаких /../ или /./
  • не начинаться с .. / или ./
  • не оканчиваются на / .. или /.

, чтобы вы могли сделать это (переносимо) с помощью оператора case:

    case "x$1" in
    (x*/..|x*/../*|x../*|x*/.|x*/./*|x./*)
        rc=1
        ;;
    (x/*)
        rc=0
        ;;
    (*)
        rc=1
        ;;
    esac
    return $rc

Это намеренно исключает такие вещи, как

/../../../foo/../../../bar

, которые допускает наивная интерпретация "ведущей косой черты".

Краткое определение абсолютного пути см. В realpath в POSIX.

3
27.01.2020, 21:07

Теги

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