Как запустить исполняемый файл из другого каталога без cd или изменения PATH?

Как запустить исполняемый файл из другого каталога без cd или изменения PATH?

Существуют варианты, похожие на тот, который я хочу спросить, но я не смог найти точный вопрос, поэтому задам его здесь.

Допустим, у меня есть скомпилированный .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», /также могут быть разрешены как невнешние команды, такие как встроенные команды оболочки и функции оболочки.

Связанный контент