Если Ваша цель состоит в том, чтобы включать заголовочный файл в начале каждого исходного файла, Вы создаете, и Вы используете 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.
В большинстве оболочек, включая 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.
Процесс может запросить файловую систему.
чтобы определить его текущий рабочий каталог, используя слишком сложный метод
быть по теме как ответ на этот вопрос.
Это то, что делают программа 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
(встроенная) просто отображает запомненное / вычисленное понятие оболочки.
из того, что это за рабочий каталог. Итак, суть в том, что оболочка может запутаться в том, где она находится.
Но если вы наберете / 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
.