Странное различие между pwd и/bin/pwd

Если Ваша цель состоит в том, чтобы включать заголовочный файл в начале каждого исходного файла, Вы создаете, и Вы используете gcc, Вы не должны изменять свои файлы вообще; можно просто добавить:

-include headerfile.h

к gcc командной строке. Из страницы справочника:

   -include file
       Process file as if "#include "file"" appeared as the first line of
       the primary source file.  However, the first directory searched for
       file is the preprocessor's working directory instead of the
       directory containing the main source file.  If not found there, it
       is searched for in the remainder of the "#include "..."" search
       chain as normal.
15
20.07.2014, 02:36
2 ответа

В большинстве оболочек, включая bash, pwd является оболочкой:

$ type -a pwd
pwd is a shell builtin
pwd is /bin/pwd

Если вы используете /бин/pwd, вы должны использовать опцию -L, чтобы получить тот же результат, что и при сборке pwd:

$ ln -s . test
$ cd test && pwd
/home/cuonglm/test
$ /bin/pwd
/home/cuonglm
$ /bin/pwd -L
/home/cuonglm/test

По умолчанию, /бин/pwd игнорирует сим-ссылки и распечатывает реальную директорию.

Из info pwd:

`-L'
`--logical'
     If the contents of the environment variable `PWD' provide an
     absolute name of the current directory with no `.' or `..'
     components, but possibly with symbolic links, then output those
     contents.  Otherwise, fall back to default `-P' handling.

`-P'
`--physical'
     Print a fully resolved name for the current directory.  That is,
     all components of the printed name will be actual directory
     names--none will be symbolic links.

Встроенная pwd включает симлинк по умолчанию, за исключением того, что используется опция -P, или -о физическом наборе встроенных настроек.

Из man bash:

pwd [-LP]
              Print the absolute pathname of the  current  working  directory.
              The pathname printed contains no symbolic links if the -P option
              is supplied or the -o physical option to the set builtin command
              is  enabled.  If the -L option is used, the pathname printed may
              contain symbolic links.  The return status is 0 unless an  error
              occurs  while  reading  the  name of the current directory or an
              invalid option is supplied.
17
27.01.2020, 19:49

Процесс может запросить файловую систему. чтобы определить его текущий рабочий каталог, используя слишком сложный метод быть по теме как ответ на этот вопрос. Это то, что делают программа pwd и библиотечная функция getcwd . На заре Unix они были единственными способами узнать, какой у вас рабочий каталог. Вот часть ответа на ваш вопрос, которую я не могу найти в любом другом ответе, или даже где-нибудь еще на этом сайте (после 42 секунд поиска):

  • Когда оболочка запускается, она получает свой текущий рабочий каталог (возможно, вызвав getcwd ).
  • После этого, когда вы выполняете cd , pushd или popd , оболочка отслеживает рабочий каталог с помощью функций обработки строк. Например,

    • Если ваш рабочий каталог / home / sim и вы набираете cd .. , оболочка вычисляет, что ваш рабочий каталог - / home .
    • Если ваш рабочий каталог / home / sim и вы набираете cd. , оболочка считает, что ваш рабочий каталог по-прежнему / home / sim .
    • Если ваш рабочий каталог / home / sim и вы набираете cd aa , оболочка вычисляет, что ваш рабочий каталог / home / sim / aa - без проверки, является ли aa символической ссылкой.

    Это сделано для экономии «стоимости» вызова getcwd . Но это компромисс, поскольку он может привести к неверной информации.

  • Команда pwd (встроенная) просто отображает запомненное / вычисленное понятие оболочки. из того, что это за рабочий каталог.
  • Кроме того, оболочка помещает запомненное / вычисленное представление о том, что это за рабочий каталог. в переменную среды PWD для удобства пользовательских процессов. Процесс никогда не должен полагаться на это, если ему нужна точная информация.

Итак, суть в том, что оболочка может запутаться в том, где она находится. Но если вы наберете / bin / pwd , это будет выполняться в отдельном процессе. который не имеет доступа к представлению оболочки о том, что такое рабочий каталог, и таким образом он определяет сам истинный рабочий каталог старомодным способом. (Исключение: программа / bin / pwd может просматривать переменную среды PWD, и, очевидно, это так, когда вы указываете -L .) Вот еще один пример того, как оболочка может запутаться:

cd / home / sim / aa # Предположим, что / home , / home / sim и ] / home / sim / aa
# - все настоящие каталоги (не символические ссылки).
pwd # Вывод: / home / sim / aa , что верно.
mv ../aa ../bb
pwd # Вывод: / home / sim / aa , что неверно.
/ bin / pwd # Вывод: / home / sim / bb , что верно.


И, на всякий случай, если вы не совсем понимаете, если вы наберете ln -s. aa и cd aa , то ваш текущий рабочий каталог не изменился , как и когда вы набираете cd. - потому что это именно то, что вы делаете, когда набираете cd aa .

7
27.01.2020, 19:49

Теги

Похожие вопросы