GNU/Linux >> Belajar Linux >  >> Linux

Memahami Arti `$_`?

Bisakah Anda menjelaskan kalimat berikut dari manual Bash tentang $_ , terutama bagian yang dicetak tebal, mungkin dengan beberapa contoh?

  1. Saat memulai shell, setel ke nama path absolut yang digunakan untuk
    memanggil skrip shell atau shell yang sedang dieksekusi sebagai diteruskan di lingkungan
    atau daftar argumen
    .

  2. Selanjutnya , memperluas argumen terakhir ke perintah
    sebelumnya, setelah perluasan.

  3. Juga disetel ke nama path lengkap digunakan untuk memanggil setiap
    perintah yang dijalankan
    dan ditempatkan di lingkungan yang diekspor ke perintah itu .

  4. Saat memeriksa email , parameter ini menyimpan nama file email.

Jawaban yang Diterima:

Saya setuju itu tidak terlalu jelas.

1. Saat memulai shell,

  • jika _ variabel berada di lingkungan yang bash diterima , lalu bash membiarkannya tidak tersentuh.

    Khususnya, jika bash shell dipanggil oleh bash lain shell (meskipun zsh , yash dan beberapa ksh implementasi juga melakukan
    itu), maka bash shell akan mengatur _ environment
    variabel ke jalur perintah yang dieksekusi (itulah poin ke-3
    dalam pertanyaan Anda). Misalnya, jika bash dipanggil untuk
    menafsirkan skrip sebagai hasil dari bash . lainnya interpretasi shell:

    bash-script some args
    

    bash . itu akan melewati _=/path/to/bash-scrip di lingkungan
    yang diberikan ke bash-script , dan itulah nilai awal
    dari $_ bash variabel akan berada di bash shell yang
    menginterpretasikan skrip tersebut.

    $ env -i _=whatever bash -c 'echo "$_"'
    whatever
    
  • Sekarang, jika aplikasi yang memanggil tidak melewati _ lingkungan
    variabel
    , bash . yang dipanggil shell akan menginisialisasi $_ ke argv[0] ia menerima
    dirinya sendiri yang dapat berupa bash , atau /path/to/bash atau /path/to/some-script atau yang lainnya (dalam contoh di atas, yang
    akan menjadi /bin/bash jika she-bang dari skrip adalah #! /bin/bash atau /path/to/bash-script tergantung pada
    sistem).

    Sehingga teks tersebut menyesatkan karena menggambarkan perilaku
    penelepon yang bash tidak memiliki kendali atas. Aplikasi yang memanggil bash mungkin tidak menyetel $_ sama sekali (dalam praktiknya, hanya beberapa
    shell dan beberapa aplikasi interaktif langka yang melakukannya, execlp() tidak
    misalnya), atau dapat menggunakannya untuk sesuatu yang sama sekali berbeda
    (misalnya ksh93 set ke *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. Selanjutnya

Selanjutnya juga tidak terlalu jelas. Dalam praktiknya, itu segera setelah bash menafsirkan perintah sederhana di lingkungan shell saat ini.

  • Dalam kasus cangkang interaktif , yang akan menjadi perintah sederhana pertama yang ditafsirkan dari /etc/bash.bashrc misalnya.

    Misalnya, pada prompt shell interaktif:

     $ 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
    
  • Untuk cangkang non-interaktif , itu akan menjadi perintah pertama di $BASH_ENV atau kode yang diumpankan ke shell itu jika $BASH_ENV tidak
    disetel.

Terkait:Perbedaan antara aplikasi GTK dan QT?

3. Saat Bash menjalankan perintah

Poin ketiga adalah sesuatu yang berbeda dan diisyaratkan dalam diskusi di atas.

bash , seperti beberapa shell lainnya akan melewati _ variabel lingkungan ke perintah yang dijalankannya yang berisi jalur yang bash digunakan sebagai argumen pertama untuk execve() panggilan sistem.

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

4. Saat memeriksa email

Poin keempat dijelaskan lebih detail dalam deskripsi MAILPATH variabel:

'MAILPATH'

Daftar nama file yang dipisahkan titik dua yang secara berkala diperiksa oleh shell
untuk email baru
.

Setiap entri daftar dapat menentukan pesan yang
dicetak saat email baru tiba di file email
dengan memisahkan
nama file dari pesan dengan '?'.
Saat digunakan dalam teks pesan
, '$_' meluas ke nama file email saat ini.

Contoh:

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

Linux
  1. Navigasi Direktori Cepat Di Bash Shell?

  2. Manakah Parameter/variabel Khusus Shell (bash)?

  3. Bagaimana BASH Shell memuat file konfigurasinya di Linux

  1. Apa yang dimaksud dengan POSIX?

  2. Apa arti dari tanda dolar ganda di bash/Makefile?

  3. Apa arti dari `! -d` dalam perintah Bash ini?

  1. Menavigasi shell Bash dengan pushd dan popd

  2. Apa perbedaan antara &> dan >&di bash?

  3. Bagaimana cara menggunakan perintah jam tangan dan pekerjaan bersama di Bash?