GNU/Linux >> Linux Esercitazione >  >> Linux

Capisci il significato di `$_`?

Potresti spiegare le seguenti frasi dal manuale di Bash su $_ , soprattutto le parti in grassetto, magari con qualche esempio?

  1. All'avvio della shell, imposta il percorso assoluto utilizzato per
    richiamare la shell o lo script della shell in esecuzione come passato nell'ambiente
    o nell'elenco di argomenti
    .

  2. Successivamente , espande l'ultimo argomento al comando
    precedente, dopo l'espansione.

  3. Imposta anche il percorso completo utilizzato per richiamare ogni
    comando eseguito
    e posizionato nell'ambiente esportato in quel comando .

  4. Quando controlla la posta , questo parametro contiene il nome del file di posta.

Risposta accettata:

Sono d'accordo che non è molto chiaro.

1. All'avvio della shell,

  • se il _ era nell'ambiente che bash ricevuto , quindi bash lascia intatto.

    In particolare, se quel bash shell è stata invocata da un altro bash shell (sebbene zsh , yash e alcuni ksh le implementazioni lo fanno anche
    ), quindi bash shell avrà impostato il _ ambiente
    al percorso del comando in esecuzione (questo è il 3°
    punto nella tua domanda). Ad esempio, se bash viene invocato per
    interpretare uno script come risultato di un altro bash interpretazione della shell:

    bash-script some args
    

    Quella bash avrà superato _=/path/to/bash-scrip nell'ambiente
    dato a bash-script , ed è il valore iniziale
    del $_ bash la variabile sarà in bash shell che
    interpreta quello script.

    $ env -i _=whatever bash -c 'echo "$_"'
    whatever
    
  • Ora, se l'applicazione di richiamo non supera un _ ambiente
    variabile
    , il bash invocato la shell inizializzerà $_ all'argv[0] riceve
    stesso che potrebbe essere bash o /path/to/bash o /path/to/some-script o qualsiasi altra cosa (nell'esempio sopra, che
    sarebbe /bin/bash se il botto della sceneggiatura fosse #! /bin/bash o /path/to/bash-script a seconda del
    sistema).

    Quindi quel testo è fuorviante in quanto descrive il comportamento del
    chiamante che bash non ha alcun controllo su. L'applicazione che ha invocato bash potrebbe benissimo non impostare $_ del tutto (in pratica, solo alcune
    shell e alcune rare applicazioni interattive lo fanno, execlp() non
    per esempio), o potrebbe usarlo per qualcosa di completamente diverso
    (per esempio ksh93 lo imposta su *pid*/path/to/command ).

    $ env bash -c 'echo "$_"'
    /usr/bin/env   (env did not set it to /bin/bash, so the value we
                   get is the one passed to env by my interactive shell)
    $ ksh93 -c 'bash -c "echo $_"'
    *20042*/bin/bash
    

2. Successivamente

Il successivamente non è neanche molto chiaro. In pratica, non appena bash interpreta un semplice comando nell'ambiente shell corrente.

  • Nel caso di una shell interattiva , che sarà sul primo semplice comando interpretato da /etc/bash.bashrc per esempio.

    Ad esempio, al prompt di una shell interattiva:

     $ echo "$_"
     ]      (the last arg of the last command from my ~/.bashrc)
     $ f() { echo test; }
     $ echo "$_"
     ]      (the command-line before had no simple command, so we get
             the last argument of that previous echo commandline)
     $ (: test)
     $ echo "$_"
     ]      (simple command, but in a sub-shell environment)
     $ : test
     $ echo "$_"
     test
    
  • Per una shell non interattiva , sarebbe il primo comando in $BASH_ENV o del codice inviato a quella shell se $BASH_ENV non è
    impostato.

Correlati:differenza tra le applicazioni GTK e QT?

3. Quando Bash esegue un comando

Il terzo punto è qualcosa di diverso ed è accennato nella discussione precedente.

bash , come poche altre shell passeranno un _ variabile di ambiente ai comandi che esegue che contiene il percorso che bash usato come primo argomento per execve() chiamate di sistema.

$ env | grep '^_'
_=/usr/bin/env

4. Quando controlli la posta

Il quarto punto è descritto più dettagliatamente nella descrizione del MAILPATH variabile:

'PERCORSO POSTALE'

Un elenco separato da due punti di nomi di file che la shell verifica periodicamente
per la nuova posta
.

Ciascuna voce dell'elenco può specificare il messaggio che
viene stampato quando arriva nuova posta nel file di posta
separando il nome del file
dal messaggio con un '?'.
Se utilizzato nel testo del messaggio
, '$_' si espande al nome del file di posta corrente.

Esempio:

$ MAILCHECK=1 MAILPATH='/tmp/a?New mail in <$_>' bash
bash$ echo test >> /tmp/a
New mail in </tmp/a>

Linux
  1. Navigazione rapida delle directory in Bash Shell?

  2. Lo scopo di .bashrc e come funziona?

  3. Quali sono i parametri/variabili speciali della shell (bash)?

  4. Come leggere l'intero script della shell prima di eseguirlo?

  5. Il significato di $? In uno script di shell?

Navigazione nella shell Bash con pushd e popd

.bashrc vs .bash_profile

Che cos'è la shell in Linux?

Comando Bash fc:utilizza facilmente Bash Shell come un professionista

Qual è la differenza tra &> e >&in bash?

Come posso utilizzare i comandi watch e jobs insieme in Bash?