
У меня есть приложение, которое я могу запустить, находясь в расположении файла, как показано ниже:
-$ cd home/myApps/app
-$ ./run.sh
Я хочу вызвать run.sh из любого места в моем терминале, не указывая полный путь. Я попробовал использовать alais и добавить приведенный ниже код в файл bashrc.
alias mylovleyapp=/home/myApps/app/run.sh
проблема в том, что всякий раз, когда я хочу запустить приложение с помощью mylovleyapp, программа возвращает ошибку, потому что run.sh зависит от других файлов в папке myApps
Как мне этого добиться?
решение1
В Рим можно попасть разными путями.
Псевдоним
Если вы предпочитаете псевдоним, вы можете сделать следующее:
alias mylovleyapp='(cd home/myApps/app && ./run.sh)'
Скобки (...)
заставляют две команды выполняться в подоболочке. Таким образом, ваш текущий каталог не изменится после завершения программы.
Скрипт-обертка в вашем PATH
Вместо этого вы можете создать скрипт-обертку и поместить его в папку, которая находится в вашем поиске PATH
, например, ~/.local/bin
или ~/bin
если вы единственный пользователь, которому нужен доступ, или /usr/local/bin
если всем пользователям нужен доступ. Тогда все, что вам нужно сделать, это ввести имя скрипта, чтобы запустить программу.
Скрипт может быть таким же, как вы обычно делаете для запуска программы:
#!/usr/bin/env bash
cd home/myApps/app
./run.sh
Сохраните этот скрипт, например, как ~/.local/bin/mylovleyapp
. Сделайте скрипт исполняемым, чтобы его можно было запустить:
chmod +x ~/.local/bin/mylovleyapp
Если ~/.local/bin
не существовало, и вам пришлось его создать, то выйдите из системы и войдите снова, чтобы он был автоматически включен в ваш PATH
. С этого момента, просто набрав mylovleyapp
в терминале, вы запустите свое приложение.
решение2
Поскольку автор не предоставил пример скрипта, я собираюсь сделать его. Он будет делать одну вещь. Запускаться ls
в каталоге скрипта.
Да, я знаю, что можно обойтись и
ls
без./
. Но в этом примере я делаю вид, что это необходимо, чтобы продемонстрировать скрипт, который использует текущий каталог скрипта.
#!/usr/bin/env bash
ls ./
Сохраните этот скрипт где-нибудь. Я сохраню его как /home/ubuntu/test/myscript
. Сделайте его исполняемым с помощью chmod +x /home/ubuntu/test/myscript
. Теперь cd
перейдите в каталог, где находится скрипт (например, cd /home/ubuntu/test
), и запустите скрипт с помощью ./myscript
:
ubuntu@computer:~/test$ ./myscript
myscript someRandomFile
Пока все хорошо. Но теперь давайте запустим его из другого каталога. Для этого примера я собираюсь запустить его из корневого каталога ( /
).
ubuntu@computer:~/test$ cd /
ubuntu@computer:/$ /home/ubuntu/test/myscript
bin dev home lib lib64 lost+found mnt proc run snap sys usr
boot etc init lib32 libx32 media opt root sbin srv tmp var
Упс. Мы хотели, чтобы он печатал файлы в месте расположения скрипта, а не в месте расположения пользователя. Прежде чем мы найдем решение, подумайте опочемуон делает это на мгновение. Ответ прост. ./
относительнопользователятекущий каталог, а не тот, где находится скрипт.
Чтобы получить каталог скрипта изнутри скрипта, мы рассмотримэтот вопрос Stack Overflow.
Суть проста: script_dir="$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )"
получим текущий каталог скрипта и сохраним его в переменной script_dir
.
Давайте обновим скрипт соответствующим образом. Теперь наш скрипт такой:
#!/usr/bin/env bash
script_dir="$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )"
ls "$script_dir"
Давайте запустим его и посмотрим, работает ли он:
ubuntu@computer:/$ /home/ubuntu/test/myscript
myscript someRandomFile
Работает! Он печатает файлы в каталоге скрипта, даже если вы не находитесь в том же каталоге, что и скрипт. Мы закончили. Общая идея проста. В скрипте ./
ссылается на каталог пользователя. "$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )"
ссылается на каталог, в котором находится скрипт. Обновите свой скрипт соответствующим образом, и он должен работать.
решение3
Вам нужно добавить путь к вашему приложению в переменную PATH. Чтобы сделать это временно, перейдите в каталог, где находится ваше приложение, а затем:
PATH=.:$PATH
Теперь вы можете вызывать свое приложение из любого места, не вводя его полный путь. Если вы закроете терминал, эта настройка будет потеряна.
Чтобы сделать его постоянным, вам нужно отредактировать файл .bashrc и добавить :/home/myApps/app в конец PATH. Сохраните новый файл .bashrc, а затем:
source .bashrc
решение4
Поэтому вам нужно изменить рабочий каталог на тот, в котором находится целевое приложение, а затем запустить приложение, чтобы оно могло найти зависимые файлы.
Я думаю, это можно сделать, указав в псевдониме две отдельные команды: одну для смены каталога и другую для запуска программы, разделенные точкой с запятой.
Таким образом, ваше .bashrc
дополнение должно выглядеть следующим образом:
alias mylovleyapp='cd /home/myApps/app; ./run.sh'
Это предполагает, что зависимые файлы находятся в /home/myApps/app
... если нет, то вы можете изменить рабочий каталог на тот, в котором находятся зависимые файлы, а затем запустить приложение, используя абсолютный путь в качестве второго компонента.