
Итак, в каталоге /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
что для его запуска не требуется находиться в определенном каталоге).