Предпочтение PATH в bashrc

Предпочтение PATH в bashrc

Мне было интересно, что происходит в следующей ситуации. Предположим, у меня есть исполняемый файл в каталоге, который находится в 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.

Связанный контент