Недавно я совершил глупейшую ошибку, работая в Linux. Я написал небольшую программу, скомпилировал ее и отчаянно пытался запустить через терминал. Исполняемый файл назывался «main». В терминале я зашел в каталог с этим файлом и наивно набрал команду:
$ main
Какого же было мое удивление, когда в ответ я получил сообщение о том, что «Команда ‘main’ не найдена…». Как так? Я все проверил еще раз: в терминале мы находились в нужном каталоге, нужный файл там есть, наименование правильное. Но почему тогда Linux его не «видит»?
Я, как водится в таких случаях, полез в Интернет и быстро понял свою ошибку. Дело в том, что Linux мыслит иначе, чем Windows. Я привык к тому, что операционная система всегда заглядывает в текущий каталог в поиске нужного файла. Но Linux при поиске исполняемых файлов ведет себя иначе. Он обращается к переменной окружения PATH. В ней перечислены каталоги, в которых Linux ищет файл, к которому вы обращаетесь. Для того, чтобы просмотреть значение этой переменной наберите в терминале:
$ echo $PATH
Каталоги разделяются двоеточием (на вашей системе может быть другой разделитель). Порядок каталогов соответствует тому порядку, в котором Linux их просматривает. Найдя файл с указанным именем, он запускает его и в другие каталоги даже не заглядывает. Если ни в одном из этих каталогов файл не найден, то выдается сообщение об ошибке. При этом текущий каталог не просматривается.
Для того чтобы изменить такое поведение нужно использовать префикс «./». То есть запуск моей программы должен выглядеть так:
$ ./main
Теперь программа нормально запускается. Учтите что при использовании префикса «./» Linux просматривает только текущий каталог. В каталоги, указанные в переменной PATH, он даже не заглядывает.