2012-03-28 12 views
40

Tytuł powinien mówić wszystko. Szukam odpowiednika ${BASH_SOURCE[0]} w zsh.

Uwaga: Trzymam znalezieniu „$0 jest równoważna ${BASH_SOURCE[0]}” w całym internecie, ale to wydaje się być fałszywa: $0 wydaje się być nazwa polecenia wykonującego. (Jest to argv[0], co ma sens.) Wyrażenie 0 USD w moim skrypcie (.zshrc) daje zsh dla $0, co nie jest tym samym, co ${BASH_SOURCE[0]}. W rzeczywistości, ${BASH_SOURCE[0]} wydaje się działać w zsh, z wyjątkiem plików wewnątrz .zshrc.

Co ja naprawdę robi w moim .zshrc (który nie działa):

echo ${BASH_SOURCE[0]} 
source `dirname $0`/common-shell-rc.sh 

źródło awarii ($0 jest zsh) i echo wysyła pustą linię.

Edit: widocznie dla $0 do pracy, muszę opcja FUNCTION_ARGZERO ustawionej opcji. Jakikolwiek sposób sprawdzić, czy jest ustawiony w skrypcie? (tak, że mogę go tymczasowo ustawić) Jest widocznie włączony, chyba że ustawisz nofunction_argzero i jest on włączony w mojej powłoce. Nadal nic nie dostaje dla $0. (Myślę, że b/c nie jestem w funkcji.)

Odpowiedz

12

$0 jest poprawna. W skrypcie źródłowym jest to nazwa skryptu, który został przekazany do wbudowania (tak, jeśli została ustawiona opcja path_dirs, może być konieczne wykonanie wyszukiwania $path w celu znalezienia rzeczywistej lokalizacji skryptu).

.zshrc nie jest zeskanowany, co tłumaczy, dlaczego $0 nie jest ustawiony na .zshrc. W każdym razie znasz nazwę i lokalizację pliku: jest to ${ZDOTDIR-~}/.zshrc.

+0

Nadal nie jestem pewien, czy to jest poprawne. Utwórz te dwa pliki: 'foo' zawierające' source./Foo2' i 'foo2' zawierające' echo $ 0'. Teraz uruchom './Foo', a otrzymasz wynik'./Foo', który jest * nie * nazwą skryptu źródłowego. Zastąp '$ 0'' $ {BASH_SOURCE [0]} ', ponownie uruchom z bash, a otrzymasz'./Foo2'. – Thanatos

+0

@Thanatos Otrzymuję './Foo2' (zsh 4.3.10, może się to w pewnym momencie zmieniło, ale nie od 4.0). W porównaniu z twoimi instrukcjami dodałem '#!/Bin/zsh' na górze' foo', aby uruchomić skrypt pod zsh. Czy na pewno używasz 'foo' pod zsh? – Gilles

+2

Tylko dla wyjaśnienia i podkreślenia ... W ** 'zsh' ** (i prawdopodobnie innych powłokach), wartość' 0 $' jest skryptem źródłowym, a nie skryptem wywołującym. To NIE działa w Bash. Tak więc '$ 0' w zsh jest takie samo jak' $ {BASH_SOURCE [0]} 'w Bashu. – toxalot

2

Może szukasz $_?

# foo.sh 
source foo2.sh 

i

# foo2.sh 
echo $_ 

daje

# ./foo.sh 
foo2.sh 
+0

dla najlepszego wyniku: '$ {BASH_SOURCE: - $ _}' – mpapis

+1

Najlepszą praktyką jest wyjaśnienie, * dlaczego * odpowiedź, którą zapewniasz, działa, lub, w przypadkach takich jak ta, gdzie odpowiedź brzmi: , w celu włączenia podstawowego wyjaśnienia tego cecha. (do diabła, nawet wklejanie krótkiej sekcji strony podręcznej nigdy nie jest złym pomysłem!) – ELLIOTTCABLE

+0

$ _ nie działa w bashu dla przypadku, w którym script1.sh źródła script2.sh, które następnie wypowiadają echo $ _. Zwróci skrypt1.sh, czyli 0 $ (główny skrypt), a $ {BASH_SOURCE [0]} zwróci skrypt2.sh (indeks wywołujący echo $ _). Więc $ _ jest po prostu jak 0 AFAICS. –

33

${BASH_SOURCE[0]} równoważne zsh jest ${(%):-%N} NIE $0 (jak PO że ten ostatni nie powiodło się .zshrc)

tutaj % wskazuje szybkie rozwinięcie wartości, %N wskazuje "Nazwa skryptu, plik źródłowy, lub funkcja powłoki, którą obecnie wykonuje zsh,

Którego niedawno rozpoczęto. Jeśli go nie ma, jest to odpowiednik parametru $ 0. "(Od man zshmisc)

+4

Świetnie - to powinno działać dla OP, ale pamiętaj, że prawdziwym odpowiednikiem '$ BASH_SOURCE' jest'% x', a nie '% N', ponieważ odnosi się on do otaczającego _file_, nawet jeśli jest wywołany wewnątrz _functions_ - innymi słowy: użyj '$ {(%): -% x}' – mklement0

+0

Hej, czytając dokumentację, nie rozumiem, dlaczego potrzebujemy ': -' tutaj i dlaczego' $ {(%)% N} 'nie ' t działa tak samo (uwaga: wiem, że to nie działa) – PierreBdR

+0

Czy istnieje dokumentacja, które inne opcje oprócz formularza -% N są dostępne? – Martin

8

W przypadku dowiązania symbolicznego.zshrc w katalogu dotfiles i chcą odwołać innych plików w folderze, a następnie spróbuj tego:

SOURCE=${(%):-%N} 
while [ -h "$SOURCE" ]; do 
    DIR="$(cd -P "$(dirname "$SOURCE")" && pwd)" 
    SOURCE="$(readlink "$SOURCE")" 
    [[ $SOURCE != /* ]] && SOURCE="$DIR/$SOURCE" 
done 
DOTFILES_DIR="$(cd -P "$(dirname "$SOURCE")" && pwd)" 

(mam skrypt pętli z here.)

+0

Czy istnieje dokumentacja, która zawiera inne opcje poza formą - % N są dostępne? – Martin

+0

[Wypróbuj dokumenty zsh] (http://zsh.sourceforge.net/Doc/Release/Prompt-Expansion.html) –

10

${(%):-%x} jest najbliżej zsh równoważne bash '$BASH_SOURCE (i) - nie.

Końcówka kapelusza dla Hui Zhenga za dostarczenie najważniejszego wskaźnika i informacji podstawowych w his answer.

Zwraca (potencjalnie) względną ścieżkę do otaczającej skryptu,

  • niezależnie od tego, czy skrypt jest bycie pozyskiwane czy nie.
    • konkretnie, to działa również wewnątrz inicjujących/profile plików, takich jak ~/.zshrc (w przeciwieństwie $0, który w niewytłumaczalny sposób zwraca ścieżkę powłoki „s tam).
  • niezależnie od tego, czy nazywa się od wewnątrz funkcji zdefiniowanej w skrypcie lub nie (w przeciwieństwie $0, która zwraca funkcji nazwę wewnątrz funkcji).

Jedyna różnica w stosunku do $BASH_SOURCE Znalazłem to w następujący niejasnych scenariusza - co może być nawet bug (obserwowane w zsh 5.0.5) wewnątrz funkcji zagnieżdżona w innej funkcji w sposób pozyskiwane skrypt ${(%):-%x} robi nie powrotną ścieżkę skryptu otaczającą kiedy to zagnieżdżona funkcja nazywa się (ponownie) później, po został pozyskiwane (zyski albo nic albo „zsh”).


Kontekst na ${(%):-%x}:

  • (%):- w miejsce innej zmiennej parametru (zmienna) rozszerzeń (${...}) sprawia sekwencje dostępne, które są zwykle używane do reprezentowania informacje dotyczące środowiska w wierszach podpowiedzi, takie jak użyte w zmiennej PS1 do określenia ciągu znaków displaye d jako główny interaktywny monit.

    • % jest przykład flagi rozprężania parametrów, z których wszystkie są wymienione w man zshexpn w pozycji Parameter Expansion Flags.
  • %x jest jednym z sekwencje, które mogą być stosowane w szybkich ciągów i działa on jak opisano powyżej; istnieje wiele innych, takich jak %d, które reprezentują bieżący katalog.

    • man zshmisc zawiera listę wszystkich dostępnych sekwencji pod nagłówkiem SIMPLE PROMPT ESCAPES.
+0

Czy istnieje dokumentacja, które inne opcje oprócz formularza -% x są dostępne? – Martin