Как можно запустить скомпилированную программу Java или C из файла оболочки, находящегося вне ее каталога?

Как можно запустить скомпилированную программу Java или C из файла оболочки, находящегося вне ее каталога?

Итак, в каталоге /home/pi/remoteinfo/temp/code есть программа на языке C с именем a.outи файл оболочки с именем tempstart.sh.

Внутри файла tempstart.sh находится следующее:

#!/bin/bash
./a.out

Теперь, когда я вхожу в систему, /home/pi/remoteinfo/temp/codeя могу печатать ./tempstart.sh, и моя программа начнет выполняться.

Но когда я пытаюсь запустить его tempstart.hиз любого места за пределами его каталога, я получаю line 3: ./a.out: No such file or directory.

Что происходит и как это исправить?

Я использую Raspberry Pi 3 с ОС по умолчанию

решение1

Происходит следующее: скрипт выполнит команду ./a.outв текущем рабочем каталоге, поскольку именно это записано в скрипте; если вы запустите скрипт из другого места, ваш двоичный файл будетне втекущий рабочий каталог, в результате чего оболочка выдает ошибку, которую вы видите.

Если вы хотите использовать скрипт для вызова двоичного файла независимо от каталога, из которого он вызывается, у вас есть как минимум четыре варианта:

  • Поместите a.outв каталог, который уже есть в вашем компьютере, PATHи перестаньте указывать текущий рабочий каталог в качестве местоположения a.out(например, переместите a.outв $HOME/bin/a.outи измените скрипт так, чтобы он просто запускался, a.outа не ./a.out).
  • Скрипт должен явно указывать полный путь к двоичному файлу (например ./a.out, вместо , вместо /path/to/the/location/of/a.out)
  • Добавьте скрипт кего PATHрасположение скрипта и не указывайте текущий каталог в качестве расположения двоичного файла (например,PATH="$PATH:/path/to/the/binary"; a.out
  • Иметь сценарийнаборрабочий каталог в место расположения скрипта перед попыткой его запуска (например cd /path/to/the/binary; ./a.out, )

решение2

./script.shпредполагается, что вы запускаете его в том же каталоге.

Допустим a.out, что в /var/run/a.out, вы можете изменить его tempstart.shтак, чтобы он содержал полный путь к файлу.

После этого вы сможете запустить скрипт из любого места (при условии, a.outчто для его запуска не требуется находиться в определенном каталоге).

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