Как мога да получа пътя до директорията, в която се намира скрипт Bash, вътре в този скрипт?
Например, да кажем, че искам да използвам Bash скрипт като стартиращо устройство за друго приложение. Искам да променя работната директория на тази, в която е разположен Bash скриптът, за да мога да работя с файловете в тази директория, както следва:
$ ./application
Използвайте име на директория "$0"
:
#!/bin/bash
echo "The script you are running has basename `basename "$0"`, dirname `dirname "$0"`"
echo "The present working directory is `pwd`"
използването само на pwd
няма да работи, ако не стартирате скрипта от директорията, в която се съдържа.
[matt@server1 ~]$ pwd
/home/matt
[matt@server1 ~]$ ./test2.sh
The script you are running has basename test2.sh, dirname .
The present working directory is /home/matt
[matt@server1 ~]$ cd /tmp
[matt@server1 tmp]$ ~/test2.sh
The script you are running has basename test2.sh, dirname /home/matt
The present working directory is /tmp
Можете да използвате $BASH_SOURCE
#!/bin/bash
scriptdir=`dirname "$BASH_SOURCE"`
Имайте предвид, че трябва да използвате #!/bin/bash, а не #!/bin/sh, тъй като това е разширение на bash
Не мисля, че това е толкова лесно, колкото другите го представят. pwd не работи, тъй като текущата директория не е непременно директорията със скрипта. $0 също невинаги има информация. Разгледайте следните три начина за извикване на скрипт.
./script
/usr/bin/script
script
При първия и третия начин $0 не разполага с пълната информация за пътя. При втория и третия начин pwd не работи. Единственият начин да се получи директорията при третия начин е да се мине през пътя и да се намери файлът с правилното съвпадение. По принцип кодът ще трябва да повтори това, което прави операционната система.
Един от начините да се направи това, което питате, би бил просто да се кодират твърдо данните в директорията /usr/share и да се направи препратка към нея по пълния път. Данните не трябва да са в директорията /usr/bin, така че вероятно това е правилният вариант.