Как видно из вашего вопроса «/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.
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 принимает списки аргументов, разделенных :::
, ::::
и т. д.