Понимание того, как работает переменная окружения PATH

Я следовал за многими руководствами и книгами, чтобы понять PATH понятие переменной, но ни один из них не объясняет "полностью", как это работает в Linux.

Например, если я установил путь как в Bash, как показано ниже:

export PATH="$VIRTUALENVWRAPPER_PYTHON:/home/ujjval/anaconda2/bin/python:/bin:/usr/bin"

Устанавливает путь к переменной с именем VIRTUALENVWRAPPER_PYTHON как справочники даны правильно?

После этого, например, если я делаю

export PATH="/usr/bin:bin:PATH"

Будет ли предыдущее значение PATH перезаписано? Кроме того, что делает :PATH в конце значит?

Помимо этого, если я напишу в моем ./bashrc файл

export PATH="$VIRTUALENVWRAPPER_PYTHON:/home/ujjval/anaconda2/bin/python:/bin:/usr/bin"

Отличается ли он от двух вышеуказанных способов установки пути?

1 ответ

Решение
export PATH="$VIRTUALENVWRAPPER_PYTHON:/home/ujjval/anaconda2/bin/python:/bin:/usr/bin"

наборы PATH для вашей текущей оболочки, используя значение $VIRTUALENVWRAPPER_PYTHON в это время.

export PATH="/usr/bin:bin:PATH"

ломает твой PATH (где bin? какой PATH). так должно быть:

export PATH="/usr/bin:/bin:$PATH"

использовать предыдущее значение PATH,

И да, последующие назначения PATH перезаписать предыдущие значения.

PATH="$VIRTUALENVWRAPPER_PYTHON:/home/ujjval/anaconda2/bin/python:/bin:/usr/bin"

устанавливает ваш PATH к текущей стоимости VIRTUALENVWRAPPER_PYTHON, возможный один файл (что неправильно - это /home/ujjval/anaconda2/bin/python файл или каталог? Должно ли это быть /home/ujjval/anaconda2/bin?) и двух системных каталогов, игнорируя предыдущее значение PATH,

Игнорирование предыдущего PATH небезопасно Например, Ubuntu добавил /snap/bin по умолчанию PATH когда началась поддержка Snap. (увидеть /etc/profile.d/apps-bin-path.sh). Ваши методы потеряют отслеживание этого каталога.

Вот как PATH (список каталогов через двоеточие) работает (от man bash:

COMMAND EXECUTION

       After a command has been split into words, if it  results  in  a  simple  command  and  an
       optional list of arguments, the following actions are taken.

       If the command name contains no slashes, the shell attempts to locate it.  If there exists
       a shell function by that name, that function is invoked as described above  in  FUNCTIONS.
       If  the  name  does  not  match a function, the shell searches for it in the list of shell
       builtins.  If a match is found, that builtin is invoked.

       If the name is neither a shell function nor a  builtin,  and  contains  no  slashes,  bash
       searches  each  element  of the PATH for a directory containing an executable file by that
       name.  Bash uses a hash table to remember the full pathnames of executable files (see hash
       under  SHELL  BUILTIN  COMMANDS  below).   A  full  search  of  the directories in PATH is
       performed only if the command  is  not  found  in  the  hash  table.   If  the  search  is
       unsuccessful,    the    shell    searches    for    a   defined   shell   function   named
       command_not_found_handle.  If that function  exists,  it  is  invoked  with  the  original
       command  and  the  original  command's arguments as its arguments, and the function's exit
       status becomes the exit status of the shell.  If that function is not defined,  the  shell
       prints an error message and returns an exit status of 127.

       If  the  search  is  successful,  or if the command name contains one or more slashes, the
       shell executes the named program in a separate execution environment.  Argument 0  is  set
       to  the  name  given,  and the remaining arguments to the command are set to the arguments
       given, if any.

       If this execution fails because the file is not in executable format, and the file is  not
       a  directory,  it  is  assumed  to be a shell script, a file containing shell commands.  A
       subshell is spawned to execute it.  This subshell reinitializes itself, so that the effect
       is  as  if  a new shell had been invoked to handle the script, with the exception that the
       locations of commands remembered by  the  parent  (see  hash  below  under  SHELL  BUILTIN
       COMMANDS) are retained by the child.

       If  the  program is a file beginning with #!, the remainder of the first line specifies an
       interpreter for the program.  The shell executes the specified  interpreter  on  operating
       systems  that  do  not  handle  this  executable  format themselves.  The arguments to the
       interpreter consist of a single optional argument following the interpreter  name  on  the
       first  line  of  the program, followed by the name of the program, followed by the command
       arguments, if any
Другие вопросы по тегам