Обнаружение getopts`--`(двойное тире )для выдачи сообщения

Как видно из вашего вопроса «/usr/bin/python3 -> python3.6», python3является символической ссылкой на python3.6. Он не использует почти никакого пространства. Python3будет ссылкой на последний python3.x, чем вы установили.

Вы можете удалить ссылку, но не сломайте что-нибудь.

Может показаться, что у вас установлено два python /usr/bin/python3.6и /usr/bin/python3.6m. Однако не то, что может ссылка - это2(2-е поле ). Если вы сделаете ls -lia /usr/bin/python*, то увидите, что они оба имеют одинаковый номер инода (, это один и тот же файл, но два разных имени ). Некоторые программы смотрят на свои имена при запуске и меняют поведение в зависимости от своего имени.

Заключение

Нет никаких свидетельств того, что установлено более одного Python 3.

0
29.08.2021, 02:12
1 ответ

Is it possible to detect the moment getopts reaches "--" so that I can issue a message?

В этом нет необходимости.

getoptsреализует стандартную обработку опций,это означает, что он прекращает поиск опций, когда либо видит аргумент, который не является опцией, либо если видит аргумент --, который явно завершает список опций. (Этот первый пункт отличается от пользовательского интерфейса GNU, который ищет параметры во всей командной строке.)

Программе не нужно заботиться о собраниях --.

Тем не менее, поскольку getoptsне уничтожает список позиционных параметров, вы можете заглянуть туда, чтобы увидеть, был ли последний аргумент --.

#!/bin/bash
while getopts a:bc opt; do
    echo "option $opt arg $OPTARG"
done
last=
if [ "$OPTIND" -ge 2 ]; then
        shift "$((OPTIND - 2))"
        last=$1
        shift 1
else
        shift "$((OPTIND - 1))"
fi
if [ "$last" = "--" ]; then
        echo "options were terminated by a double-dash (or last arg was an option-argument '--')"
fi
echo "remaining args: $*"

Это дало бы, например,.

$ bash opts.sh -a blah -- -b foo
option a arg blah
options were terminated by a double-dash (or last arg was an option-argument '--')
remaining args: -b foo

, но поскольку он смотрит только на последний аргумент, это может быть либо разделитель --, либо --в качестве аргумента -для какой-либо опции. Например. это ложное срабатывание, --здесь не разделитель:

$ bash opts.sh -a -- foo
option a arg --
options were terminated by a double-dash (or last arg was an option-argument '--')
remaining args: foo

Конечно, вы также можете реализовать свою собственную обработку опций, но это немного раздражает, так как оболочка затрудняет обработку подстрок. (Вам нужно распознать -abcкак три разных параметра, или как один, или как два, в зависимости от того, принимает ли -aили -bаргумент параметра -.)

В любом случае, если вы не делаете что-то гораздо более сложное, чем обычно требуется, не должно быть никаких причин смотреть на --. Даже если вы делаете что-то более сложное, вы можете сделать это внеgetopts(и с другим разделителем ), аналогично тому, как дается выражение в findили как GNU parallel принимает списки аргументов, разделенных :::, ::::и т. д.

3
29.08.2021, 16:50

Теги

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