Существуют варианты, похожие на тот, который я хочу спросить, но я не смог найти точный вопрос, поэтому задам его здесь.
Допустим, у меня есть скомпилированный .c
файл, в результате чего получается исполняемый файл ex
, который находится как /mnt/f/C_F/ex
. Я вполне могу выполнить его изнутри /mnt/f/C_F
, ./ex
но что, если я захочу сделать это, /mnt/f
скажем, из (или из любого каталога, если на то пошло). Я не хочу добавлять /mnt/f/C_F/
PATH для этого.
Я не смог найти решение и полагаю, что это невозможно. Пожалуйста, подтвердите это.
решение1
Используйте абсолютный путь к этому файлу.
/mnt/f/C_F/ex
Это должно работать всегда, независимо от вашего текущего рабочего каталога. Как правило, по этой причине вам, вероятно, следует предпочесть абсолютные пути в скриптах (хотя есть важные исключения).
решение2
Вы всегда можете использовать относительный или полный путь к исполняемому файлу.
Когда вы находитесь в /mnt/f
, вы можете запустить:
C_F/ex
# or
/mnt/f/C_F/ex
решение3
Любойпуть1 к исполняемому файлу, содержащему хотя бы одно /
произведение.Наличие символа /
в имени команды сообщает оболочке, что вы просите ее запустить определенный файл и что вы указываете определенное место, где этот файл должен быть найден. Это часть синтаксиса, который ожидает оболочка; в большинстве других контекстов приемлемо, чтобы (относительные) пути не содержали /
символа.
Для исполняемого файла, который отсутствует в текущем каталоге,это любой путь к этому вообще. Невозможно записать путь к файлу в другом каталоге без использования хотя бы одного /
. Это делает запуск файлов в других каталогах более простым случаем, хотя он и менее знаком.
Абсолютные пути--нравиться
/mnt/f/C_F/ex
--начните с/
.Относительные путив файл в другом каталоге--
C_F/ex
когда вы находитесь в/mnt/f
каталоге — всегда содержит/
, даже если он не в начале. Относительный путь без/
— это просто имя файла, идентифицирующее файл в текущем каталоге. (Хотя обратное неверно. Относительный путь может содержать , но/
при этом ссылаться на файл в текущем каталоге; см. ниже.)Обратите внимание, что относительные пути должны по-прежнему фактически ссылаться на нужный вам файл, чтобы они работали, и независимо от того, ссылается ли относительный путь на нужный вам файлзависит от того, в каком каталоге вы сейчас находитесь, так как они разрешаются относительно текущего каталога.
Для исполняемого файла, которыйявляетсяв текущем каталоге кратчайший относительный путь обычно не работает, поскольку он не содержит /
. Таким образом, это более сложный случай, хотя он и более знаком. Когда вы находитесь в каталоге, где ex
находится исполняемый файл, вы не можете просто запустить ex
, хотя ex
это вполне хороший относительный путь к этому исполняемому файлу.
Причина, по которой это не работает, заключается в том, что имя команды, которое не содержит a, /
не рассматривается как относительный путь или любой другой путь. Вместо этого,он рассматривается как имя файла и ищетсяв каталогах, перечисленных в $PATH
. 2
Вот почему вы используете ./ex
, когда находитесь в том же каталоге, что и ex
.Каждый каталог содержит .
запись, которая ссылается на сам каталог. Этообеспечивает способдля записи относительного пути, который идентифицирует тот же файл, ex
но содержит /
в себе и, таким образом, может использоваться в качестве имени команды, которое оболочка обрабатывает как путь.
Таким образом, префикс ./
— это не специальный синтаксис, а просто второй по простоте способ записать относительный путь к файлу в текущем каталоге и самый простой способ сделать это из тех, которые содержат расширение /
.
1 В этом ответе я использую «путь» в значении «имя_пути». Это наиболее распространенное использование «пути», но не единственное. «Путь», как я использую здесь термин, не следует путать спуть поиска исполняемого файла, представляющий собой набор каталогов, пути к которым перечислены и разделены :
символами,в $PATH
переменной окружения.
2 Имена команд, не содержащие символа «a», /
также могут быть разрешены как невнешние команды, такие как встроенные команды оболочки и функции оболочки.