Соответствует ли стандарту posix использование математических скобок в двойных скобках?

Возможно, я немного опоздал с этим постом... но для тех, кому он покажется полезным, я вставил весь .bashrcфайл из ParrotOS сюда .

Это та часть, которая вас интересует:

if [ "$color_prompt" = yes ]; then
    PS1="\[\033[0;31m\]\342\224\214\342\224\200\$([[ \$? != 0 ]] && echo \"[\[\033[0;31m\]\342\234\227\[\033[0;37m\]]\342\224\200\")[$(if [[ ${EUID} == 0 ]]; then echo '\[\033[01;31m\]root\[\033[01;33m\]@\[\033[01;96m\]\h'; else echo '\[\033[0;39m\]\u\[\033[01;33m\]@\[\033[01;96m\]\h'; fi)\[\033[0;31m\]]\342\224\200[\[\033[0;32m\]\w\[\033[0;31m\]]\n\[\033[0;31m\]\342\224\224\342\224\200\342\224\200\342\225\274 \[\033[0m\]\[\e[01;33m\]\\$\[\e[0m\]"
else
    PS1='┌──[\u@\h]─[\w]\n└──╼ \$ '
fi

0
30.10.2020, 14:59
1 ответ

Функция $((math expression))является функцией POSIX и поддерживается всеми современными оболочками, совместимыми с POSIX.

POSIX, однако, не стандартизирует имена путей, и по этой причине POSIX называет его неуказанным, что происходит, когда вы вызываете/bin/sh

Вот почему POSIX не стандартизировал #! /bin/shни...

Существуют версии UNIX, которые предлагают старую оболочку Bourne, если вы вызываете /bin/sh. Все версии Solaris до Solaris -10 поставляются со старой оболочкой Bourne Shell в /bin/sh, которая не поддерживает $((math expression)). Эти версии Solaris по-прежнему сертифицированы на соответствие POSIX. Существуют и другие операционные системы с другими типами оболочки (POSIX или без -POSIX ).

Linux, например. обычно идет с bashили dashв /bin/sh. dashобеспечивает только базовую совместимость с POSIX, чего недостаточно для платформы POSIX, которую разрешено называть UNIX , поскольку она не поддерживает многобайтовые символы. bashв Linux также не полностью совместим с UNIX системой, так как (в Linux )он скомпилирован таким образом, что по умолчанию используется несовместимый с -echoвстроенный модуль..

Кстати, :если вы хотите получить POSIX-совместимую оболочку на сертифицированной POSIX платформе, вам нужно позвонить:

PATH=`getconf PATH`
export PATH
sh

Это работает, потому что getconf PATHтребуется для возврата настройки PATH, в которой POSIX-совместимые варианты программ находятся первыми.

Другими словами, :если у вас есть сценарий оболочки, начинающийся с #!/bin/sh, не гарантируется, что $((math expression))будет работать. Что на самом деле происходит, зависит от платформы, на которой вы его запускаете. Даже если оболочка совместима с POSIX, для работы требуются только основные математические выражения языка C. $((i++)).не разрешено работать с оболочкой, сертифицированной на соответствие POSIX.

Какая оболочка на самом деле находится в определенном пути, можно проверить, запустив:

$shell whatshell.sh

получить whatshell.shизhttps://www.in-ulm.de/~mascheck/various/whatshell/

2
18.03.2021, 22:53

Теги

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