Mengapa 'echo $ 0' memberikan hasil yang berbeda untuk dua terminal yang berbeda?

15

Saya membuka terminal di Ubuntu menggunakan Ctrl+ Alt+ Tdan terminal yang berbeda dengan masuk ke direktori dan kemudian mengklik kanan dan memilih "Buka di Terminal".

Saya melakukan echo $0dalam kedua kasus.

Dalam kasus pertama:

$ echo $0
-bash

Dalam kasus kedua:

$ echo $0
/bin/bash

Kenapa ada perbedaan ini?

Kode biru
sumber
$ 0 mengembalikan nama proses yang sedang berjalan.
Ramesh
Apakah Anda menjalankan dua terminal dengan pengguna yang berbeda?
cuonglm
Saya menggunakan pengguna yang sama
CodeBlue
3
pertanyaan serupa askubuntu.com/questions/368509/why-is-0-set-to-bash
Avinash Raj
Apakah mereka sebenarnya emulator terminal yang berbeda atau hanya dua contoh emulator terminal yang sama? Apakah keduanya terminal default?
terdon

Jawaban:

16

Jika output dari echo $0perintah -bashitu berarti bashitu dipanggil sebagai shell login. Jika output hanya bash, maka Anda berada di shell non-login.

man bash kata suatu tempat di baris 126:

A  login shell is one whose first character of argument zero is a -, or 
one started with the --login option.

Lihat lebih lanjut di sini: Perbedaan antara Shell Login dan Shell Non-Login? .

Sekarang, untuk menjelaskan mengapa Anda masuk /bin/bashdalam kasus kedua, saya dapat mengatakan bahwa sebuah program (dalam kasus Anda manajer file Anda, mungkin nautilus) atau skrip dapat mengubah sendiri $0ke sesuatu yang lain. Sebagai contoh, lihat apa yang terjadi dengan $0terminal saya (terminal yang sama sepanjang waktu):

masukkan deskripsi gambar di sini

Radu Rădeanu
sumber
12

Perbedaannya tergantung pada bagaimana ini dimulai. bash akan menginisialisasi secara berbeda (baca skrip startup yang berbeda) tergantung pada argvnya [0]. Jika string dimulai dengan tanda hubung -seperti pada -bashmaka ia berjalan sebagai shell login, jika tidak, itu akan berjalan sebagai shell interaktif. Itu juga dapat dijalankan sebagai shell non-interaktif (mis. Dalam skrip shell).

Untuk mengetahui lebih lanjut, sebaiknya baca manual, man bashbagian INVOCATION.

X Tian
sumber
9

Sebuah shell dimulai ketika Anda login, tapi itu juga dimulai oleh program-program seperti make, atau ketika Anda menjalankan shell script, atau ketika Anda mengetik :shke vi, atau ketika Anda membuat jendela terminal baru.

Awalnya, shell membaca ~/.profilesaat Anda masuk atau berlari su. Script ini akan melakukan hal-hal seperti mengumumkan apakah Anda memiliki email baru, menyesuaikan karakter Anda dan membunuh karakter, dan mengatur dan mengekspor variabel TERM dan PATH. Ketika dimulai di hampir semua konteks lain, shell tidak membaca ~/.profile, karena melakukan sebagian besar dari hal-hal itu akan berlebihan. Anda diharapkan telah mengekspor variabel shell penting ke shell baru.

Cara shell tahu apakah membaca ~/.profileadalah untuk memeriksa apakah karakter pertama argv[0], alias $0, adalah '-'.

Dimulai dengan csh, alias diperkenalkan. Alias ​​tidak diekspor ke lingkungan. cshdirancang untuk membaca dalam dua skrip inisialisasi yang berbeda. ~/.logindibaca hanya ketika pengguna masuk, dan isyarat untuk melakukan ini adalah jika argv[0]dimulai dengan '-'. ~/.cshrcdibaca setiap kali shell dimulai. Secara umum, satu alias ditempatkan di ~/.cshrcdan yang lainnya di ~/.login. cshjuga didukung ~/.logout, yang dalam kebanyakan kasus hanya membersihkan layar dan berlari fortune.

Kerang lain mengadopsi fitur yang sama ini. kshakan membaca ~/.kshrc, bashakan membaca ~/.bashrc, dan di sanalah Anda akan menempatkan definisi alias Anda.

Jadi, untuk membuat cerita panjang pendek, aplikasi yang memunculkan shell harus memutuskan apakah itu harus menjadi "shell login", dalam hal ini ada yang '-'di awal, atau shell biasa. Dalam kebanyakan kasus, shell yang akan interaktif dimulai sebagai shell login, dan shell yang dimaksudkan hanya untuk menjalankan beberapa perintah, baik sebagai argumen atau dari skrip, dan kemudian keluar adalah shell biasa.

Tapi semuanya tergantung pada kehendak aplikasi yang memulai shell.

Tandai Plotnick
sumber