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 $0
dalam kedua kasus.
Dalam kasus pertama:
$ echo $0
-bash
Dalam kasus kedua:
$ echo $0
/bin/bash
Kenapa ada perbedaan ini?
bash
ubuntu
terminal
gnome-terminal
Kode biru
sumber
sumber
Jawaban:
Jika output dari
echo $0
perintah-bash
itu berartibash
itu dipanggil sebagai shell login. Jika output hanyabash
, maka Anda berada di shell non-login.man bash
kata suatu tempat di baris 126:Lihat lebih lanjut di sini: Perbedaan antara Shell Login dan Shell Non-Login? .
Sekarang, untuk menjelaskan mengapa Anda masuk
/bin/bash
dalam kasus kedua, saya dapat mengatakan bahwa sebuah program (dalam kasus Anda manajer file Anda, mungkin nautilus) atau skrip dapat mengubah sendiri$0
ke sesuatu yang lain. Sebagai contoh, lihat apa yang terjadi dengan$0
terminal saya (terminal yang sama sepanjang waktu):sumber
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-bash
maka 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 bash
bagian INVOCATION.sumber
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:sh
kevi
, atau ketika Anda membuat jendela terminal baru.Awalnya, shell membaca
~/.profile
saat Anda masuk atau berlarisu
. 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
~/.profile
adalah untuk memeriksa apakah karakter pertamaargv[0]
, alias$0
, adalah'-'
.Dimulai dengan
csh
, alias diperkenalkan. Alias tidak diekspor ke lingkungan.csh
dirancang untuk membaca dalam dua skrip inisialisasi yang berbeda.~/.login
dibaca hanya ketika pengguna masuk, dan isyarat untuk melakukan ini adalah jikaargv[0]
dimulai dengan'-'
.~/.cshrc
dibaca setiap kali shell dimulai. Secara umum, satu alias ditempatkan di~/.cshrc
dan yang lainnya di~/.login
.csh
juga didukung~/.logout
, yang dalam kebanyakan kasus hanya membersihkan layar dan berlarifortune
.Kerang lain mengadopsi fitur yang sama ini.
ksh
akan membaca~/.kshrc
,bash
akan 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.
sumber