Рейтинг:1

Как я могу запустить приложение из любого места в терминале, не указывая полный путь

флаг vu

У меня есть приложение, которое я могу запустить, пока я нахожусь в файле, как показано ниже:

-$ cd домой/мои приложения/приложение
-$ ./run.sh

Я хочу вызвать run.sh из любого места в моем терминале, не указывая полный путь, я попытался использовать alais и добавить приведенный ниже код в файл bashrc.

псевдоним mylovleyapp=/home/myApps/app/run.sh

проблема в том, что всякий раз, когда я хочу запустить приложение с помощью mylovleyapp, программа возвращает ошибку, потому что run.sh зависит от других файлов в папке myApps

Как я могу этого добиться?

cocomac avatar
флаг cn
Вероятно, в сценарии есть строка `./something`. Но это относится к _вашему_ текущему каталогу, а не к текущему каталогу скрипта. Когда вы запускаете его из того места, где находится скрипт, они одинаковы, так что это не имеет значения. Но когда вы запускаете его из другого места, это вызывает проблемы.Взгляните на [этот вопрос о переполнении стека] (https://stackoverflow.com/q/59895/16886597), чтобы узнать, как получить текущий каталог скрипта изнутри скрипта. Обновите свой скрипт этим, и все будет хорошо.
Will avatar
флаг id
@cocomac, может быть, поставишь это как ответ? Я думаю, что это, вероятно, решает проблему лучше, чем мой ответ.
cocomac avatar
флаг cn
@Я отвечу через несколько минут?
cocomac avatar
флаг cn
@Смогу ли я сделать правильный ответ
Рейтинг:2
флаг cn

Поскольку ОП не предоставил образец сценария, я собираюсь его сделать. Это сделает одну вещь. Бег лс в каталоге скрипта.

Да, я знаю, что ты можешь просто сделать лс без ./. Но для этого примера я делаю вид, что это необходимо, чтобы продемонстрировать сценарий, который использует текущий каталог сценария.

#!/usr/bin/env bash
лс ./

Сохраните этот скрипт где-нибудь. сохраню как /home/ubuntu/тест/myscript. Сделайте его исполняемым с помощью chmod +x /home/ubuntu/test/myscript. В настоящее время CD в каталог, где находится скрипт (например, компакт-диск /дом/убунту/тест) и запустите скрипт с помощью ./скрипт:

ubuntu@computer:~/test$ ./myscript
myscript какой-то RandomFile

Все идет нормально. Но теперь давайте запустим его из другого каталога. В этом примере я собираюсь запустить его из корневого каталога (/).

ubuntu@computer:~/test$cd/
ubuntu@computer:/$ /home/ubuntu/test/myscript
bin dev home lib lib64 потерянный + найденный mnt proc run snap sys usr
загрузка и т. д. init lib32 libx32 media opt root sbin srv tmp var

Упс. Мы хотели, чтобы он печатал файлы в местоположении скрипта, а не в местоположении пользователя. Прежде чем мы найдем решение, подумайте о Почему это делается на мгновение. Ответ прост. ./ относительно пользователя текущий каталог, а не один из скрипта.

Чтобы получить каталог скрипта изнутри скрипта, мы посмотрим на этот вопрос о переполнении стека.

Суть его проста: 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 )"
лс "$script_dir"

Давайте запустим его и посмотрим, работает ли он:

ubuntu@computer:/$ /home/ubuntu/test/myscript
myscript какой-то RandomFile

Оно работает! Он печатает файлы в каталоге скрипта, даже если вы не находитесь в том же каталоге, что и скрипт. Готово. Общая идея проста. В сценарии ./ относится к каталогу пользователя. "$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )" относится к каталогу, в котором находится скрипт. Обновите свой скрипт соответствующим образом, и он должен работать.

Рейтинг:1
флаг cn

Есть много путей в Рим.

Псевдоним

Если вы предпочитаете псевдоним, вы можете сделать следующее:

псевдоним mylovleyapp='(cd home/myApps/app && ./run.sh)'

Брекеты (...) заставить две команды работать в подоболочке. Таким образом, ваш текущий каталог не изменится после завершения программы.

Сценарий-оболочка в вашем PATH

Вместо этого вы можете создать сценарий-оболочку и поместить его в папку, которая находится в вашем поиске. ДОРОЖКА, например ~/.локальные/бен или же ~/бен если вы единственный пользователь, которому нужен доступ, или /USR/местные/бен если всем пользователям нужен доступ. Затем все, что вам нужно сделать, это ввести имя скрипта для запуска программы.

Сценарий может быть тем, что вы обычно делаете для запуска программы:

#!/usr/bin/env bash
компакт-диск домой/мои приложения/приложение
./run.sh

Сохраните этот скрипт, например, как ~/.local/bin/mylovleyapp. Сделайте скрипт исполняемым, чтобы его можно было запустить:

chmod +x ~/.local/bin/mylovleyapp

Если ~/.локальные/бен не существовало, и вам нужно было создать его, затем выйти и снова войти, чтобы он автоматически ДОРОЖКА. С этого момента просто введите mylovleyapp в терминале запустит ваше приложение.

MindC3ll avatar
флаг vu
Ванадий большое спасибо за ответ! .. это сработало как шарм .. Я создал сценарий-оболочку для своего пути, и это просто идеально.
Рейтинг:1
флаг cn

Вам нужно добавить путь к вашему приложению в переменную PATH. Чтобы сделать это временно, перейдите в каталог, в котором находится ваше приложение, а затем:

ПУТЬ=.:$ПУТЬ

Теперь вы можете вызывать свое приложение из любого места, не вводя полный путь. Если вы закроете терминал, эта настройка будет потеряна.

Чтобы установить его на постоянной основе, вам нужно отредактировать файл .bashrc и добавить :/home/myApps/app в конец вашего PATH. Сохраните новый файл .bashrc, а затем:

источник .bashrc
Рейтинг:0
флаг id

Поэтому вам нужно изменить свой рабочий каталог на тот, в котором находится целевое приложение, а затем запустить приложение, чтобы оно могло найти зависимые файлы.

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

Так что ваши .bashrc дополнение следует читать:

псевдоним mylovleyapp='cd /home/myApps/app; ./run.sh'

Это предполагает, что зависимые файлы находятся в /дом/мои приложения/приложение ... если нет, вы можете изменить рабочий каталог на каталог с зависимыми файлами, а затем запустить приложение, используя абсолютный путь в качестве второго компонента.

MindC3ll avatar
флаг vu
нельзя ли сделать папку универсальной?
cocomac avatar
флаг cn
@ MindC3ll Да, есть. См. [мой комментарий] (https://askubuntu.com/questions/1368492/how-i-can-run-application-from-anywhere-in-the-terminal-without-being-in-the-ful/1368496# комментарий 2351406_1368492). Это сложнее, чем ответ Уилла, но это будет означать, что вы можете запустить скрипт без перехода в каталог.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.