Bash Manual mówi (manpage, mój nacisk):
Gdy Bash wywołuje polecenie zewnętrzne, zmienna
$_
jest ustawiana na pełną ścieżkę do polecenia i przekazywana do tego polecenia w jego środowisku.
I ( parametry specjalne ):
_
(
$_
podkreślenie.) Przy uruchamianiu powłoki ustaw bezwzględną nazwę ścieżki używaną do wywoływania powłoki lub skryptu powłoki wykonywanego tak, jak przekazano w środowisku lub liście argumentów. Następnie rozwija się do ostatniego argumentu do poprzedniego polecenia, po rozwinięciu. Ustawiono również na pełną ścieżkę używaną do wywołania każdego wykonanego polecenia i umieszczonego w środowisku wyeksportowanym do tego polecenia. Podczas sprawdzania poczty ten parametr przechowuje nazwę pliku poczty.
W powłoce bash uruchamiam:
$ bash $ export | grep '_='
Zgodnie z instrukcją
_
powinna być zmienną środowiskową nowej powłoki bash.export
ma wypisywać wszystkie zmienne środowiskowe nowej powłoki bash, ale nie wypisuje_
. Zastanawiam się więc, czy_
zmienna środowiskowa nowej powłoki bash?Tak naprawdę dzieje się w każdej powłoce bash
$ export | grep '_='
nic nie wydaje. Zastanawiam się więc, czy
_
kiedykolwiek jest zmienną środowiskową powłoki bash?Dla porownania:
$ dash $ export | grep '_=' export _='/bin/dash'
Mój post jest zainspirowany komentarzem Mike'a i odpowiedzią Stephane'a .
export
jest wbudowany, ale jeśli go użyjeszprintenv _
, pokaże ci, jak został wywołany:/usr/bin/printenv
w tym systemie.bash -c export | grep _=
(od bash), będzie pokazać jak skorupa rodzic powołuje się nabash
komendę, choć$_
nie jest ustawiona na rodzica.Odpowiedzi:
Tak,
_
jest zmienną środowiskową nowej powłoki Bash; możesz to zobaczyć uruchamiającwewnątrz powłoki: pokazuje zawartość początkowego środowiska powłoki. Nie zobaczysz go w pierwszej powłoce, ponieważ nie było poprzedniej powłoki, która mogłaby ją ustawić przed jej uruchomieniem.
Rozwijanie
$_
w Bash odnosi się do_
specjalnego parametru, który rozwija się do ostatniego argumentu poprzedniego polecenia. (Wewnętrznie Bash obsługuje to za pomocą_
zmiennej powłoki, która jest aktualizowana za każdym razem, gdy parsowana jest komenda, ale tak naprawdę jest to szczegół implementacji. Jest „nieportowany” za każdym razem, gdy parsowana komenda. )export
Nie wyświetla się,_
ponieważ nie jest zmienna oznaczona jako wyeksportowana; możesz to jednak zobaczyć na wyjściuset
.W pierwszym przykładzie, nowe Analizuje powłoki bash i wykonuje polecenia w plikach startowych, więc gdy uruchomiony
explore | grep '-='
,_
został już nadpisane i oznaczone jako nie eksport.W tym
dash
przykładzie wydaje się, że nie wykonuje on żadnego pliku startowego, więc widzisz zmienną jako zmienną środowiskową, która została ustawiona przez Bash przed uruchomieniemdash
.źródło
export | grep '_='
wyświetla? Dlaczego w oryginalnej powłoce bash nic nietr '\0' '\n' < /proc/$$/environ | grep _=
wyświetla?_
jest usuwany ze środowiska i jak mogę go wyeksportować z powrotem do środowiska ?export
bez argumentów wyświetla listę wszystkich eksportowanych zmiennych ._
nie jest zmienną, ale jest wymieniony jako parametr specjalny .Nieco mylące
_
byłoby również prawidłowe określenie zmiennej , w przeciwieństwie do nazw innych specjalnych parametrów. Przynajmniej Bash 4.4 pozwala na przypisanie do niego bez reklamacji. Jest to po prostu nieprzydatne, ponieważ efekt specjalny natychmiast zastępuje wartość.źródło
_
jako zmiennej ;-). Jest efektywnie tylko do zapisu, a wartość jest natychmiast tracona._
jak zmienną, dlatego pojawia się na wyjściuset
. Jednak nie można go oznaczyć jako wyeksportowany, o ile mogę to ustalić.Nie wszystkie zmienne powłoki są oznaczone jako wyeksportowane, jak widać na wyjściu
declare -p
.bash
Oznaczanie$_
jako eksportowane nie ma sensu, ponieważ automatycznie dodaje tę zmienną do środowiska procesów potomnych, ale z inną wartością niż ta, którą ma w powłoce (w tym momencie).Wyświetlanie go jako wyeksportowanego po prostu wprowadzałoby użytkownika w błąd co do tego, co się stanie ze środowiskiem poleceń zewnętrznych.
Wszystkie „zmienne środowiska wykonawczego”
BASH*
nie są eksportowane.źródło