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.