Puncte:1

Cum pot rula aplicația de oriunde în terminal fără a fi în calea completă

drapel vu

Am o aplicație pe care o pot rula cât timp sunt în locația fișierului, ca mai jos:

-$ cd home/myApps/app
-$ ./run.sh

Vreau să apelez run.sh de oriunde în terminalul meu fără a fi în calea completă, am încercat să folosesc alais și să adaug codul de mai jos în fișierul bashrc.

alias mylovleyapp=/home/myApps/app/run.sh

problema este că ori de câte ori vreau să rulez aplicația folosind mylovleyapp, programul returnează eroarea deoarece run.sh depinde de alte fișiere din folderul myApps

Cum pot realiza asta?

cocomac avatar
drapel cn
Scriptul are probabil o linie care este `./something`. Dar aceasta este reluată pentru directorul curent _your_, nu pentru directorul curent al scriptului. Când îl rulați de unde este scriptul, cele două sunt la fel, deci nu contează. Dar când îl rulezi din altă parte, creează probleme.Aruncați o privire la [această întrebare Stack Overflow](https://stackoverflow.com/q/59895/16886597) pentru a afla cum să obțineți directorul curent al scriptului din interiorul scriptului. Actualizați-vă scriptul cu asta și ar trebui să fiți gata.
Will avatar
drapel id
@cocomac poate pune asta ca răspuns? Cred că probabil abordează problema mai bine decât răspunsul meu.
cocomac avatar
drapel cn
@Vă voi face un răspuns în câteva minute
cocomac avatar
drapel cn
@Voi face un răspuns corect
Puncte:2
drapel cn

Deoarece OP nu a furnizat un exemplu de script, voi face unul. Va face un lucru. Alerga ls în directorul scriptului.

Da, știu că poți să faci ls fara ./. Dar, pentru acest exemplu, mă prefac că este necesar, pentru a demonstra un script care utilizează directorul curent al scriptului.

#!/usr/bin/env bash
ls./

Salvați acel script undeva. O voi salva ca /home/ubuntu/test/myscript. Faceți-l executabil cu chmod +x /home/ubuntu/test/myscript. Acum CD în directorul în care se află scriptul (de ex., cd /home/ubuntu/test) și rulați scriptul cu ./scriptul meu:

ubuntu@computer:~/test$ ./myscript
myscript someRandomFile

Până acum, bine. Dar acum să-l rulăm dintr-un alt director. Pentru acest exemplu, îl voi rula din directorul rădăcină (/).

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

Hopa! Am vrut să imprime fișierele în locația scriptului, nu în locația utilizatorului. Înainte de a găsi soluția, gândiți-vă De ce face asta pentru o clipă. Răspunsul este simplu. ./ este relativ la ale utilizatorului directorul curent, nu cel al scriptului.

Pentru a obține directorul scriptului din interiorul scriptului, ne vom uita la această întrebare Stack Overflow.

Esenta este simplă: script_dir="$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )" va obține directorul curent al scriptului și îl va stoca în variabilă script_dir.

Să actualizăm scriptul în consecință. Scriptul nostru este acum acesta:

#!/usr/bin/env bash
script_dir="$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )"
ls "$script_dir"

Hai să-l rulăm și să vedem dacă funcționează:

ubuntu@computer:/$ /home/ubuntu/test/myscript
myscript someRandomFile

Funcționează! Tipărește fișierele din directorul scriptului, chiar și atunci când nu sunteți în același director cu scriptul, am terminat. Ideea generală este simplă. În scenariu, ./ se referă la directorul utilizatorului. "$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )" se referă la directorul în care se află scriptul. Actualizați scriptul în consecință și ar trebui să funcționeze.

Puncte:1
drapel cn

Trebuie să adăugați calea aplicației la variabila PATH. Pentru a face acest lucru temporar, mergeți la directorul în care se află aplicația dvs. și apoi:

CALEA=.:$CALEA

Acum vă puteți apela aplicația de oriunde, fără a fi nevoie să-i introduceți calea completă. Dacă închideți terminalul, această setare se va pierde.

Pentru a-l seta permanent, trebuie să editați fișierul .bashrc și să adăugați :/home/myApps/app la sfârșitul PATH. Salvați noul fișier .bashrc și apoi:

sursa .bashrc
Puncte:1
drapel cn

Există multe căi către Roma.

Alias

Dacă preferați un alias, puteți face după cum urmează:

alias mylovleyapp='(cd home/myApps/app && ./run.sh)'

Bretele (...) face ca cele două comenzi să ruleze într-un subshell. Astfel, directorul dvs. curent nu se va fi schimbat odată ce programul s-a încheiat.

Un script wrapper în PATH

În schimb, puteți crea un script wrapper și îl puteți plasa într-un folder care se află în căutarea dvs CALE, de exemplu. ~/.local/bin sau ~/bin dacă sunteți singurul utilizator care are nevoie de acces sau /usr/local/bin dacă toți utilizatorii au nevoie de acces. Apoi, tot ce trebuie să faceți este să introduceți numele scriptului pentru a lansa programul.

Scriptul poate fi exact ceea ce faceți în mod normal pentru a porni programul:

#!/usr/bin/env bash
cd home/myApps/app
./ alerga.sh

Salvați acel script, de exemplu, ca ~/.local/bin/mylovleyapp. Faceți scriptul executabil astfel încât să poată fi rulat:

chmod +x ~/.local/bin/mylovleyapp

Dacă ~/.local/bin nu exista și trebuia să-l creați, apoi să vă deconectați și apoi să vă reconectați pentru a-l include automat în dvs CALE. De acum înainte, doar tastând myloveyapp în terminal va rula aplicația dvs.

MindC3ll avatar
drapel vu
Multumesc mult vanadium pentru raspuns! .. a funcționat ca un farmec .. Am creat un script wrapper pe calea mea și asta este pur și simplu perfect.
Puncte:0
drapel id

Deci, trebuie să vă schimbați directorul de lucru în cel în care se află aplicația țintă, apoi să executați aplicația astfel încât să poată găsi fișierele dependente.

Cred că puteți face acest lucru dând două comenzi separate în alias: una pentru a schimba directorul și cealaltă pentru a executa programul, separate prin punct și virgulă.

Deci dvs .bashrc adiție ar trebui să citească:

alias mylovleyapp='cd /home/myApps/app; ./run.sh'

Asta presupune că fișierele dependente sunt în /home/myApps/app ... dacă nu, atunci puteți schimba directorul de lucru în cel cu fișierele dependente, apoi rulați aplicația folosind o cale absolută ca a doua componentă.

MindC3ll avatar
drapel vu
nu există vreo modalitate de a face folderul universal?
cocomac avatar
drapel cn
@MindC3ll Da, există. Vezi [comentul meu](https://askubuntu.com/questions/1368492/how-i-can-run-application-from-anywhere-in-the-terminal-without-being-in-the-ful/1368496# comentariu2351406_1368492). Este mai complex decât răspunsul lui Will, dar va însemna că puteți rula script-ul fără `cd`-ing la director

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.