Bir yola önek olarak kullanıldığında ~ (dalga) nedir?


11

Düzenleme: Bu, /programming/998626/meaning-of-tilde-in-linux-bash-not-home-directory/ kopyası . Bu soruyu yinelenen olarak kapatma şöhretim yok.

Ben ~ana dizinde olduğu gibi değil, bu atıfta :

$ ls ~foo/bar
/some/mount/point/foo/bar

Ancak farklı bir bağlama noktası ile denerseniz, örneğin:

$ mount | ag "/dev "
devfs on /dev (devfs, local, nobrowse)
$ ls /dev/stdin
/dev/stdin
$ ls ~stdin
zsh: no such user or named directory: stdin . 
# bash has a similar error message: 
ls: ~stdin: No such file or directory

~Bu bağlamda ne denir? O nasıl çalışır?

Düzenleme: Aşağıdaki yorumlardan bazılarına dayalı olarak daha fazla bilgi:

  1. Bunun foosistemimde bir kullanıcı adı olmadığını kanıtlayabilirim .
  2. Otomatik tamamlama girişimi sırasında ls -lah ~tüm seçenekler gösterilmez. yani ben açabiliyorum cd ~qux, ne zaman quxotomatik tamamlamada görünmüyor. Yine quxbenim sistemimdeki bir kullanıcı değil.
  3. Önemli /some/mount/pointise bir ağ paylaşımı.
  4. Tüm ayrıntılar, yol adı genişletmesinin bir Z kabuğu özelliği olan bazı adlandırılmış yol muckery'lerini önerir, ancak bu görünüşte Z kabuğunun adlandırılmış yolları gibi şeyleri desteklemeyen bash'da da çalışır.

5
~fookullanıcının giriş dizinidir foo. Kullanıcı belirtilmezse, geçerli kullanıcı varsayılan değerdir.
DopeGhoti

Ama bu durumda, /some/mount/pointkesinlikle benim ana dizinim değil. cd ~beni /Users/$username/--which maçlarına götürür$HOME
RD

1
zshaynı zamanda, adlandırılmış dizinleri belirtmek için yaklaşık işareti kullanır.
DopeGhoti

Ben de şüphelendim !! Bazı nedenlerden ötürü, yukarıda gönderdiğim komutlar dizisi bash -c "ls ~foo/bar"de isimlendirilmiş dizinlere sahip olmayan bash ( ) biçiminde de çalışır . Ayrıca zsh içinde bile, eğer incelersem, envadlandırılmış dizinleri görmüyorum. Mac OS kullanıyorum ve bu OS X'e özgü bir özellik olduğunu hissediyorum.
RD

1
Sadece dedin ~foo. Asıl dizeyi alın (örnek değil foo) ve yapın grep "actual username" /etc/passwd. bash kılavuzuna göre ~textyalnızca olası oturum açma kullanıcı adları için çalışmalıdır (örneğin oturum açabileceği anlamına gelmez; örneğin sistem kullanıcıları ~lpiçin). Tüm testlerde, içinde ~stringolan tekabül stringkullanıcı adı olmaktan.
Sergiy Kolodyazhnyy

Yanıtlar:


14

~ Foo nedir

Bash kılavuzundan alıntı (ek vurgu ile):

Sözcük tırnaksız tilde karakteriyle (`~ ') başlarsa, ilk tırnaksız eğik çizgiden önceki tüm karakterler (veya tırnaksız eğik çizgi yoksa tüm karakterler) tilde öneki olarak kabul edilmez. tilde öneki alıntılanır, tilde işaretini izleyen tilde önekindeki karakterler olası bir oturum açma adı olarak kabul edilir .

~foofookullanıcının giriş dizinine tam olarak belirtildiği şekilde genişler /etc/passwd. Bunun, sistem kullanıcı adlarını içerebileceğini unutmayın; ille de insan kullanıcıları veya yerel olarak oturum açabilecekleri anlamına gelmez (örneğin SSH anahtarlarıyla oturum açabilirler).

Belirtildiği gibi Aslında, yorumlarla , bashkullanacağı getpwnamişlevi. Bu işlevin kendisi POSIX standardı tarafından belirtilir , bu nedenle macOS X dahil çoğu Unix benzeri sistemde mevcut olmalıdır . Bu işlev /etc/passwdyalnızca sınırlı değildir ve LDAP ve NIS gibi diğer veritabanlarında arama yapar. 394. satırdan başlayarak bash kaynak kodundan , tilde.cdosyadan özel alıntı :

  /* No preexpansion hook, or the preexpansion hook failed.  Look in the
     password database. */
  dirname = (char *)NULL;
#if defined (HAVE_GETPWNAM)
  user_entry = getpwnam (username);
#else
  user_entry = 0;

Pratik örnek

Aşağıda sistemimdeki sistem kullanıcı adları ile yapılan testleri görebilirsiniz. İlgili passwdgirişe ve sonucuna dikkat edinls ~username

$ grep '_apt' /etc/passwd
_apt:x:104:65534::/nonexistent:/bin/false
$ ls ~_apt
ls: cannot access '/nonexistent': No such file or directory
$ grep '^lp' /etc/passwd
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
$ ls ~lp
ls: cannot access '/var/spool/lpd': No such file or directory

Örneğin, _apthesap çıktı tarafından önerilen şekilde kilitlenmiş olsa bile passwd -S apt, yine de mümkün olduğu kadar oturum açma adı gösteriliyor:

_apt L 11/29/2017 0 99999 7 -1

Lütfen dikkat: Bu macOS'a özgü bir özellik değil, kabuğa özel bir özelliktir.


Kabuğun, hesap son kullanma tarihi veya kilitli olup olmadığını veya yaklaşık işareti genişletirken bir şey bulmaya güvenebileceğinden şüpheliyim. Örneğin Linux'ta, son kullanma tarihi, /etc/shadowparola gibi diğer korumalı kimlik doğrulama bilgileriyle birlikte saklanır . İçindeki başvuru passwd, parolayı geçersiz kılmakla ilgilidir: bu, başka yollarla kimlik doğrulamasını engellemez.
ilkkachu

@ilkkachu Evet, haklısın. Bunu testuserparola son kullanma tarihi ekleyerek ve değiştirerek test ettim . Kullanıcı adı hala sekme tamamlandığında görünür. Bu cevabı cevabından çıkardım
Sergiy Kolodyazhnyy

1
Bu cevapla ilgili tek sorun, bashman sayfasını (ve eskisini bu gibi görünüyor) tırnak içine almasıdır . OP aslında kullanıyor zsh(daha açık olabilirdi), ancak yorumlarda bashaynı davranışa sahip olduğu belirtiliyor .
Ken Wayne VanderLinde

2
Kabuk ile aynı arama mekanizmalarını izlemek getent passwd fooyerine kullanabilirsiniz grep foo /etc/password- belki de @Abigail'nın bahsettiği ağ tabanlı dizin hizmetleri dahil.
RJHunter

1
Benim durumumda doğru olan 'LDAP ve NIS gibi' bit için cevap olarak kabul edildi!
RD

5

Neden bir şey gördüğünüzün özetinde ~foo/bar, bunun nedeni foo, sistemde barana dizininde adlandırılmış bir klasörle adlandırılmış bir kullanıcınızın olmasıdır .

Bu çözümü, (tilde) ~öğesinin neden "ana dizinden" daha fazla olduğunu açıklayan başka bir toplulukta görün .

binSisteminizde bir kullanıcı varsa , bin'in ana dizininin içeriğini şu komutla listeleyebilirsiniz :

ls ~bin

Deneyebileceğiniz başka bir şey, aşağıdaki istemi yazdıktan sonra sekme tamamlamayı kullanmaktır (satırbaşı kullanmayın, sadece sekme tuşunu kullanın):

ls -lah ~ tab

~devam ederseniz genişleyecek kullanıcıların ana dizinlerinin listesini görmek için Sekmesinin tamamlanmasına örnek (kesilmiş) çıktıls -lah ~ tab

$ ls -lah ~ [tab]
~antman/            ~games/
~bin/               ~mail/

1
Sekme tamamlama için +1. Bu, bash'ın mümkün olan giriş adlarını alabileceği tüm kullanıcı adlarını açıkça ortaya koymaktadır /etc/passwd. Kullanıcı elbette sistemdeki kullanıcı adlarının farkındaysa neler olup bittiğini hemen anlamaya yardımcı olur.
Sergiy Kolodyazhnyy

2
Bash tamamlamadaki ipucu için teşekkürler - bazı ilginç otomatik tamamlama sonuçlarıyla sonuçlandı. ~fooOtomatik tamamlama yaparken , foosistemimdeki bir kullanıcı olmadığını (ve gerçekten de mevcut olmadığını /etc/passwd) kanıtlayabilirim . Ayrıca, tüm klasörler / dosyalar /some/mount/pointsüper ilginç olan otomatik tamamlamada görünür.
RD
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.