Co oznacza $ {GZIP_BINDIR - '/ bin'} w bash?

13

Czy ktoś może wyjaśnić, co oznacza to polecenie?

PATH="${GZIP_BINDIR-'/bin'}:$PATH"; export PATH
Rashmi Narahari
źródło

Odpowiedzi:

19

${GZIP_BINDIR-'/bin'}to bashwzorzec ekspansji parametrów. Od man bash:

${parameter:-word}
              Use Default Values.  If parameter is unset or null, 
the expansion of word is substituted.  Otherwise, the  value  of parameter
is substituted.

Bezpośrednio przed tą częścią strona podręcznika ma (dzięki @jwodder za powiadomienie):

Omitting the colon results in a test only for a parameter that is unset.

Jak mówi strona podręcznika, ustawi domyślną wartość zmiennej GZIP_BINDIR. Jeśli GZIP_BINDIRwcześniej ustawiono wartość (inną niż null, ponieważ nie używasz :), wówczas ta wartość zostanie użyta, w przeciwnym razie /binzostanie użyta jako wartość zmiennej GZIP_BINDIR.

Z drugiej strony, jeśli chcesz również przetestować wartości zerowe, użyj tego wzorca (dołącz :):

${GZIP_BINDIR:-'/bin'}

Następnie $PATHzostanie rozszerzony do wartości, które wcześniej trzymał. Więc jeśli PATHwcześniej miał:

/usr/sbin:/usr/bin

Teraz twój PATHbędzie (biorąc pod uwagę, że GZIP_BINDIRnie jest ustawiony):

/bin:/usr/sbin:/usr/bin

export PATHudostępni to PATHwszystkim procesom potomnym.

heemayl
źródło
Myślę, że nie odebrano :w${GZIP_BINDIR-'/bin'} ” Niekoniecznie. ${parameter-word}jest również poprawny, choć nie wydaje się, że znajduje się na stronie podręcznika.
nyuszika7h
@ nyuszika7h Tak, nie wiedziałem o tym wcześniej. Dziwne, dlaczego nie zostało uwzględnione na stronie podręcznika ..
heemayl
Na stronie podręcznika bash na moim komputerze akapit tuż powyżej sekcji :-mówi: „Gdy nie wykonuje się rozszerzenia podciągów, używając formularzy opisanych poniżej (np .: :-), test bash dla parametru, który jest nieustawiony lub zerowy. Pominięcie dwukropka daje wynik testu tylko dla parametru, który nie jest ustawiony.
jwodder
Na marginesie możesz połączyć ustawienie PATHi exportw jedno polecenie w następujący sposób:export PATH="${GZIP_BINDIR-'/bin'}:$PATH"
Paddy Landau
8

Czy naprawdę nie ma dwukropka przed łącznikiem wewnątrz rozwinięcia parametru ${GZIP_BINDIR-'/bin'}?

Tego rodzaju konstrukcja jest prawie zawsze zapisywana dwukropkiem, ${GZIP_BINDIR:-'/bin'}co oznacza, że ​​„jeśli $ GZIP_BINDIR ma wartość NULL lub jest nieustawione, ustaw ją na„ / bin ””

Podana składnia jest jednak poprawna, ale rzadka. ${GZIP_BINDIR-'/bin'}(bez dwukropka) oznacza: „jeśli $ GZIP_BINDIR jest rozbrojony, ustaw go na„ / bin ””. Jeśli jest ustawiony (został zadeklarowany), ale nic mu nie przypisano (np. Ma wartość NULL), nic nie zostanie wstawione.

Może występować tutaj błąd, ponieważ dwukropek następujący po konstrukcji zmiennej (...} :$ PATH ...) będzie nadal wstawiany, jeśli $ GZIP_BINDIR jest ustawiony, ale NULL. Ponieważ spowoduje to dodanie dwukropka na początku zmiennej $ PATH, spowoduje to przeszukanie bieżącego katalogu w pierwszej kolejności.

Jest to uważane przez większość za problem z bezpieczeństwem, ponieważ ułatwia wywołanie złośliwego programu o takiej samej nazwie jak standardowe polecenia, po prostu umieszczając go w bieżącym katalogu.

Aby pozostawić $ PATH bez zmian, jeśli $ GZIP_BINDIR jest ustawiony, ale NULL (pusty), poprawna składnia to ${GZIP_BINDIR-'/bin:'}$PATH; export PATH

Aby pozostawić $ PATH bez zmian, jeśli $ GZIP_BINDIR jest albo nieuzbrojone, albo ustawione, ale NULL, poprawna składnia to ${GZIP_BINDIR:-'/bin:'}$PATH; export PATH

DocSalvager
źródło
2

To polecenie aktualizuje zmienną PATH.

PATHJest zmienna określająca zbiór katalogów, w których znajdują się programy wykonywalne.

PATH="${GZIP_BINDIR-'/bin'}:$PATH";

To dodaje wartość innej zmiennej, GZIP_BINDIRjeśli wyjście do poprzedniej ŚCIEŻKI, zamiast tego użyj / bin i dodaj ją do ŚCIEŻKI

export PATH

eksport służy do ustawienia ŚCIEŻKI dostępnej dla wszystkich procesów potomnych i podpowłok Przeczytaj to, aby uzyskać więcej informacji na temat

Musisz pamiętać, że nie jest to statyczne i stracisz je po wyjściu z powłoki.

Aby trwale edytować ŚCIEŻKĘ, musisz dołączyć te linie do swojego .bashrc

gedit .bashrc

i dodaj linię

export PATH="${GZIP_BINDIR-'/bin'}:$PATH"

następnie uruchom polecenie

source .bashrc
Maythux
źródło
GZIP_BINDIR jest zmienną
Maythux
co jest nie tak Nie, nie zrobiłem tego? moja jest również przegłosowana
Maythux
Po co głosować ?!
Maythux