'Echo $ 0' neden iki farklı terminal için farklı sonuçlar veriyor?


15

Bir dizine gidip "Terminalde Aç" ı seçerek Ctrl+ Alt+ Tve farklı bir terminal kullanarak Ubuntu'da bir terminal açtım .

Her echo $0iki durumda da yaptım .

İlk durumda:

$ echo $0
-bash

İkinci durumda:

$ echo $0
/bin/bash

Neden bu fark?


$ 0, çalışan işlemin adını döndürür.
Ramesh

Farklı kullanıcılarla iki terminal çalıştırıyor musunuz?
cuonglm

Aynı kullanıcıyı kullanıyorum
CodeBlue


Aslında farklı terminal emülatörleri mi yoksa aynı terminal emülatörünün sadece iki örneği mi? İkisi de varsayılan terminal mi?
terdon

Yanıtlar:


16

echo $0Komutun çıktısı, oturum açma kabuğu olarak çağrıldığı -bashanlamına gelir bash. Çıktı sadece ise bash, o zaman oturum açma olmayan bir kabuktasınız demektir.

man bash 126. satırda bir yerde şöyle diyor:

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

Burada daha fazla bilgi bulabilirsiniz: Login Shell ile Login Olmayan Shell arasındaki fark? .

Şimdi, /bin/bashikinci durumda neden aldığınızı açıklamak için , bir programın (sizin durumunuzda dosya yöneticiniz, muhtemelen nautilus) veya bir komut dosyasının kendi $0başını başka bir şeye değiştirebileceğini söyleyebilirim . Örneğin $0, terminalimde neler olduğunu görün (her zaman aynı terminal):

resim açıklamasını buraya girin


12

Fark, bunların başlatılma şekline bağlıdır. bash, argv [0] 'a bağlı olarak farklı şekilde başlatılır (farklı başlangıç ​​komut dosyalarını oku). Dize -, içinde olduğu gibi kısa çizgi ile başlıyorsa, bir -bashgiriş kabuğu olarak çalışır, değilse, etkileşimli bir kabuk olarak çalışır. Ayrıca etkileşimli olmayan bir kabuk olarak da çalışabilir (yani bir kabuk komut dosyasında).

Daha fazla bilgi edinmek için el kitabını, man bashİNVOKASYON bölümünü okumak en iyisidir .


9

Bir kabuk, oturum açtığınızda başlatılır, ancak aynı zamanda make, bir kabuk komut dosyası çalıştırdığınızda veya yazdığınızda veya yeni bir terminal penceresi oluşturduğunuzda da başlatılır .:shvi

Başlangıçta, ~/.profileoturum açtığınızda veya koştuğunuzda kabuk okunur su. Bu komut dosyası, yeni e-postanızın olup olmadığını duyurmak, silme ve öldürme karakterlerinizi özelleştirmek ve TERM ve PATH değişkenlerini ayarlamak ve vermek gibi şeyler yapar. Neredeyse başka bir bağlamda başlatıldığında, kabuk okumadı ~/.profile, çünkü bunların çoğunu yapmak gereksiz olurdu. Önemli kabuk değişkenlerini yeni kabuğa aktarmanız bekleniyordu.

Kabuğun okumayı okuyup okumadığını bilme şekli ~/.profileilk karakterinin argv[0], yani ilk karakterin olup olmadığını kontrol $0etmekti '-'.

Başlangıç ​​olarak csh, takma adlar tanıtıldı. Takma adlar çevreye ihraç edilmedi. cshiki farklı başlatma komut dosyasını okumak üzere tasarlanmıştır. ~/.loginyalnızca bir kullanıcı oturum açtığında okundu ve bunun için ipucu argv[0]başladıysa idi '-'. ~/.cshrckabuk her başlatıldığında okundu. Genel olarak, biri diğer adları ~/.cshrcve diğer her şeyi yerleştirdi ~/.login. cshAyrıca ~/.logoutçoğu durumda ekranı temizledi ve koştu fortune.

Diğer mermiler de aynı özellikleri benimsedi. kshokur ~/.kshrc, bashokur ~/.bashrcve takma ad tanımlarınızı koyacağınız yerlerdir.

Yani, uzun bir hikaye kısa yapmak için, bir kabuk üreten uygulama onun bir "giriş kabuğu" olup olmadığına karar verir, bu durumda '-'başlangıçta veya düzenli bir kabuk var. Çoğu durumda, etkileşimli olacak bir kabuk bir giriş kabuğu olarak başlatılır ve yalnızca komutları bağımsız değişkenler veya bir komut dosyasından çalıştırmak için kullanılan bir kabuk başlar ve sonra çıkış normal bir kabuktur.

Ancak her şey, kabuğun başlangıcını başlatan uygulamanın hevesidir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.