Мне было интересно, что происходит в следующей ситуации. Предположим, у меня есть исполняемый файл в каталоге, который находится в PATH в .bashrc. Если я скопирую файл в другой каталог, который также установлен в PATH, и запущу этот файл из терминала, какую копию я запущу?
Могу ли я задать настройку, которая будет звучать так: «Если файл существует в нескольких местах в PATH, выполнить файл в первом месте, а не файл во втором месте».
решение1
Быстрый ответ
Чтобы узнать, какая копия bash
будет пытаться выполниться, используйте встроенную утилиту 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
.