Что произойдет, если я назову функцию сценария bash именем двоичного файла, расположенного в переменной PATH? - PullRequest
8 голосов
/ 23 августа 2011

Предположим, я пишу функцию в скрипте bash с именем доступного двоичного файла, скажем, pwd:

function pwd(){
    echo '/'
}

Хорошо, это кажется немного странным, но вопрос в том, что произойдет, если дальше в моем сценарии я напишу команды:

cd /usr
pwd

Что pwd будет использоваться? Кроме того, как я могу заставить использование другого?

Ответы [ 3 ]

9 голосов
/ 23 августа 2011

Ваша функция будет вызвана, потому что она скрывает встроенную команду pwd.

Для принудительного выполнения команды используйте встроенную команду command:

command pwd

Из руководства bash:

   command [-pVv] command [arg ...]
          Run command with args  suppressing  the  normal  shell  function
          lookup.  Only builtin commands or commands found in the PATH are
          executed.  If the -p option is given, the search for command  is
          performed  using  a default value for PATH that is guaranteed to
          find all of the standard utilities.  If  either  the  -V  or  -v
          option is supplied, a description of command is printed.  The -v
          option causes a single word indicating the command or file  name
          used to invoke command to be displayed; the -V option produces a
          more verbose description.  If the -V or -v option  is  supplied,
          the  exit  status  is  0 if command was found, and 1 if not.  If
          neither option is supplied and an error occurred or command can-
          not  be found, the exit status is 127.  Otherwise, the exit sta-
          tus of the command builtin is the exit status of command.
6 голосов
/ 23 августа 2011

Функция будет иметь приоритет.Вы можете легко проверить это, используя type pwd.

Учитывая, что pwd является встроенным, вы можете достичь реальной реализации, используя builtin pwd.

Если вы действительно хотите получить исполняемый файлиз вашей системы вы можете обратиться к его пути, например, используя $(which pwd).

0 голосов
/ 23 августа 2011

Функции имеют приоритет над поиском пути. Используйте полный путь, чтобы избежать блокировки функции. Ключевое слово builtin обеспечивает аналогичное средство для встроенных ключевых слов Bash (echo, cd и т. Д.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...