opis zmiennej BASH_SOURCE dla debila

0

No wiec pisze ostatnio troche skryptow w Bashu, i od czasu do czasu musze dowiedziec sie w skrypcie gdzie lezy. Robie to mniej wiecej tak:

ME="$(cd "$(dirname "$0")" && pwd)"

Jednak ostatnio napisalem bash completion (moje skrypty potrafia podpowiadac parametry na wcisniecie tabulatora) no i taki skrypt sie najczesciej 'sourcuje':

. bash_completion.sh

Pech chce, ze w takim skrypcie rowniez musze sie dowiedziec, gdzie on lezy, lecz $0 tutaj jest ustawione na: bash 4.2: "bash", bash 4.1.5: "-bash" (skad ta roznica?), co jest w tym momencie zle. Po wielu poszukiwaniach, czytaniach, probach i bledach mam 2 rozwiazania:

  1. ME="$(cd "$(dirname "${BASH_ARGV[0]}")" && pwd)"
  2. ME="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"

Pierwsza jest ponoc troche niebezpieczna, poniewaz man bash mowi ze ona BASH_ARGV jest dostepne tylko w 'extended debugging mode' (cokolwiek to jest, u mnie dziala za kazdym razem, ale ok).

Druga jest podobno idealna (na stackoverflow ktos tak powiedzial), jednakze czytajac w man basha o tej zmiennej prawde mowiac nie rozumiem z tego nic.

Czy moglby mi ktos prosze wylozyc jak dla debila, co ta zmienna dokladnie oznacza?

1

W FUNCNAME masz stos nazw funkcji, które aktualnie się wykonują. Pod indeksem 0 masz aktualnie wykonywaną funkcję. W BASH_SOURCE masz nazwy plików odpowiadające tym funkcjom.

Więc w BASH_SOURCE[0] masz nazwę pliku, w którym znajduje się aktualnie wykonywana funkcja. W BASH_SOURCE[1] masz nazwę pliku, w którym znajduje się funkcja, która wywołała aktualnie wykonywaną funkcję itd, itd.

0

Tak, znam angielski bardzo dobrze, i rozumiem te fragmenty z man bash, ale dzieki za potwierdzenie ;d
Bardziej chodzi mi o 'aktualnie wykonywana funkcje' - moj skrypt wyglada mniej wiecej tak:

bash_completion.sh:

#!/bin/bash

ME=<tutaj pobieram moja lokacje za pomoca BASH_ARGV lub BASH_SOURCE>

function __complete {
  // magia ktora wymaga ME
}

complete -F __complete run.sh
 

i sourcuje tak:

~/.bashrc:

...
. /opt/costam/bash_completion.sh
 

W momencie gdy sourcuje ten plik, jaka funkcja jest aktualnie wykonywana? Nie ma zadnej funkcji w momencie gdy tworzone jest ME.

1 użytkowników online, w tym zalogowanych: 0, gości: 1