«Который» построен -в команде? Могу ли я переопределить это?

Имена пакетов обрабатываются как описано в документации дляapt-get install(да, не очевидно):

If no package matches the given expression and the expression contains one of '.', '?' or '*' then it is assumed to be a POSIX regular expression, and it is applied to all package names in the database. Any matches are then installed (or removed). Note that matching is done by substring so 'lo.*' matches 'how-lo' and 'lowest'. If this is undesired, anchor the regular expression with a '^' or '$' character, or create a more specific regular expression.

Строго говоря, эта проверка происходит после выполнения подстановки доступных имен пакетов — поэтому спецификации пакетов сначала проверяются на точное совпадение, затем проверяются на соответствие подстановке (с использованием ?и *), и если это ничего не находит, а спецификация пакета содержит ., ?или *, интерпретируемые как регулярные выражения. (Вы можете увидеть поведение подстановки, запустив apt-cache policy 'firefo?', который соответствует использованию только подстановки, а затем apt-cache policy 'firefox?', который заканчивается использованием регулярного выражения.)

apt-cache policy 'firefox*'соответствует использованию подстановок. Если вы хотите заставить его соответствовать с помощью регулярного выражения, вы можете вместо этого использовать что-то вроде apt-cache policy 'firefox.*'; проверьте наличие mozilla-firefoxв выходных данных, чтобы увидеть, соответствует ли выражение глобусу или регулярному выражению.

apt-cache searchзадокументирована явно как обработка регулярных выражений, потому что ее аргументы всегда обрабатываются как регулярные выражения.

Учитывая тип поддерживаемых aptрегулярных выражений, исключение -l10n-, вероятно, невозможно; см. этот ответ SO для получения подробной информации.

1
30.06.2020, 14:38
4 ответа

У вас много вопросов. Попробуем ответить на них:

Является ли 'который' построенным -в команде?

Да

  • Встроенная в некоторые оболочки (csh, tcsh и zsh ),
  • Отслеживаемый псевдоним (то, что оболочка печатает в type whichдля хешированной команды (читайте оhash))в (lksh, mksh, ksh93 и attsh )и
  • Внешнее приложение в (dash, bash, yash ).

Итак, общего простого ответа не существует.

Могу ли я переопределить его?

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

Для отмены:

  • специальное встроенное использование псевдонима,
  • обычная встроенная функция (то, что должно быть )использует либо псевдоним, либо функцию.
  • И, если используется PATH, вы всегда можете добавить исполняемый файл раньше других.
  • Кроме того, некоторые оболочки могут предоставлять дополнительные элементы управления встроенными функциями, например (%builtin )в поиске путей Minix I (1989 )ash shell или enable/ отключить в ksh, bash, zsh

Является ли в openSUSE команда «what» отдельным приложением?

Да, как и в Fedora, Debian и многих других. Но все же свое особое слово в этом могут сказать снаряды.

Это встроенная команда -в других дистрибутивах?

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

Будет ли команда 'what' в PATH переопределять команду по умолчанию, встроенную -в одну?

Нет,поскольку приложение является последним исполняемым элементом в последовательности поиска выполнения.

Относится ли это также к команде cd и другим встроенным -командам?

A cdявляется обычной встроенной функцией, поэтому она может быть переопределена псевдонимом или функцией (в терминах Posix :, только если исполняемый файл с таким же именем существует в ПУТЬ ).

3
18.03.2021, 23:23
$ help
 alias [-p] [name[=value]... ]          logout [n]
 bg [job_spec...]                       mapfile [-d delim] [-n count] [-O or>
 bind [-lpsvPSVX] [-m keymap] [-f file>  popd [-n] [+N | -N]
 break [n]                               printf [-v var] format [arguments]
 builtin [shell-builtin [arg...]]       pushd [-n] [+N | -N | dir]
 caller [expr]                           pwd [-LP]
 case WORD in [PATTERN [| PATTERN]...)>  read [-ers] [-a array] [-d delim] [->
 cd [-L|[-P [-e]] [-@]] [dir]            readarray [-d delim] [-n count] [-O >
 command [-pVv] command [arg...]        readonly [-aAf] [name[=value]...] o>
 compgen [-abcdefgjksuv] [-o option] [>  return [n]
 complete [-abcdefgjksuv] [-pr] [-DEI]>  select NAME [in WORDS... ;] do COMM>
 compopt [-o|+o option] [-DEI] [name.>  set [-abefhkmnptuvxBCHP] [-o option->
 continue [n]                            shift [n]
 coproc [NAME] command [redirections]    shopt [-pqsu] [-o] [optname...]
 declare [-aAfFgilnrtux] [-p] [name[=v>  source filename [arguments]
 dirs [-clpv] [+N] [-N]                  suspend [-f]
 disown [-h] [-ar] [jobspec... | pid >  test [expr]
 echo [-neE] [arg...]                   time [-p] pipeline
 enable [-a] [-dnps] [-f filename] [na>  times
 eval [arg...]                          trap [-lp] [[arg] signal_spec...]
 exec [-cl] [-a name] [command [argume>  true
 exit [n]                                type [-afptP] name [name...]
 export [-fn] [name[=value]...] or ex>  typeset [-aAfFgilnrtux] [-p] name[=v>
 false                                   ulimit [-SHabcdefiklmnpqrstuvxPT] [l>
 fc [-e ename] [-lnr] [first] [last] o>  umask [-p] [-S] [mode]
 fg [job_spec]                           unalias [-a] name [name...]
 for NAME [in WORDS... ] ; do COMMAND>  unset [-f] [-v] [-n] [name...]
 for (( exp1; exp2; exp3 )); do COMMAN>  until COMMANDS; do COMMANDS; done
 function name { COMMANDS ; } or name >  variables - Names and meanings of so>
 getopts optstring name [arg]            wait [-fn] [id...]
 hash [-lr] [-p pathname] [-dt] [name >  while COMMANDS; do COMMANDS; done
 help [-dms] [pattern...]               { COMMANDS ; }
root@machinexa:~# help | grep which
root@machinexa:~# 

Что не является встроенным bash? Прокомментируйте, если я ошибаюсь Кроме того, чтобы просмотреть путь, выполните env $PATH, вы также можете проверить, что в каждом пути, например ls /usr/bin/which, где /usr/bin заменяется всеми путями

0
18.03.2021, 23:23

Это легко узнать с помощьюwhich:

В Fedora 32:

$ which which
alias which='(alias; declare -f) | /usr/bin/which --tty-only --read-alias --read-functions --show-tilde --show-dot'
    /usr/bin/which

$ rpm -qf /usr/bin/which
which-2.21-19.fc32.x86_64

Итак, отдельная команда.

1
18.03.2021, 23:23

whichявляется встроенным -в zsh, но не в большинстве других оболочек. Если вы используете zsh и вызываете which, он будет использовать встроенную оболочку -, что является типичным поведением, когда команда и встроенная оболочка -имеют одно и то же имя.

Если вы хотите вызвать команду, POSIX предоставляет встроенную commandдля этого:command which. Если вы хотите узнать, где находится команда, в POSIX это можно сделать command -v.

3
18.03.2021, 23:23

Теги

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