2

Мне было интересно, что происходит в следующей ситуации. Предположим, у меня есть исполняемый файл в каталоге, который находится в PATH в .bashrc. Если я скопирую файл в другой каталог, который также указан в PATH, и выполню из терминала этот файл, какую копию я запускаю?

Могу ли я установить предпочтение, чтобы сказать: «если файл существует в более чем одном месте в пределах PATH, выполните это во-первых, а не во втором».

1 ответ1

4

Быстрый ответ

Для того, чтобы выяснить , какие копии bash будет пытаться выполнить, используйте встроенный type утилиты Баш в. Чтобы узнать, какая копия du , например, будет выполнена, запустите:

$ type du
du is /usr/bin/du

Теория

Когда вы просите bash выполнить что-то, bash выполняет два шага:

Во-первых, он проверяет свой кэш на наличие файла. Это список имен исполняемых файлов и места, где находился файл в последний раз, когда bash его выполнил.

Во-вторых, если файл не находится в кэше, он проверяет путь, ища каждый каталог в пути слева направо.

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

Подробнее

Чтобы увидеть, что находится в текущем кэше bash, запустите:

$ declare -p BASH_CMDS
declare -A BASH_CMDS='([du]="/usr/bin/du" )'

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

Чтобы увидеть текущий путь, выполните:

$ echo $PATH
/bin:/usr/bin:/opt/bin:/usr/local/bin:/usr/X11R6/bin

Путь - это список, разделенный двоеточиями. Выше показано пять каталогов в пути. Их будут искать, начиная слева и работая справа.

Могу ли я установить предпочтение?

Да, вы можете изменить порядок каталогов в пути.

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

$ alias dd=/opt/bin/dd

После установки вышеуказанного псевдонима вы можете ввести dd в командной строке, и bash будет игнорировать кеш и игнорировать PATH и запускать (или пытаться запустить) /opt/bin/dd .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .