Tilde kullanmak, ana dizine kısayol olarak çalışıyor mu?


30

Kafam karışmıştı, bazı dosyaları bir bilgisayardan diğerine kopyalamaya çalışıyordum. Anladım ama sözdizimi hala kafamı karıştırıyor. Bu çalışıyor:

scp ~/Desktop/Volenteer.png jay@server.ip:~j0h/b

hangi Volenteer.pngklasöre koyar /home/j0h/b. Ancak, bu işe yaramıyor:

scp ~Desktop/Volenteer.png     jay@server.ip:~j0h/b

Bu da başarısız olur ve bulunmayan bir çıkış durumu 1 dosyası verir:

scp ~/Desktop/Volenteer.png     jay@server.ip:~/j0h/b

Bu gibi:

scp ~Desktop/Volenteer.png     jay@server.ip:~j0h/b

Yani açıkça, arasında bir fark var ~ve ~/ bu fark varlığını/

$~/
bash: /home/j0h/: Is a directory
$ ~
bash: /home/j0h: Is a directory

Öyleyse neden scp içinde yapar ~gerekli kararlılığı ~/? Bu bir tahmin, olup bittiğini doğrulayamıyorum. Ancak tutarsız ve bu nedenle kafa karıştırıcı görünüyor. Bu scp bir hata mı? ya da bende kaçıyorum tilde hakkında bir şey var mı?


2
Burada sadece bir not, "gönüllü" yazıldığından, "e" yerine "u"
AER

2
Ben liberal bir hececiyim.
j0h

Yanıtlar:


68

~ Ana dizininiz.

~foofooböyle bir kullanıcı varsa, kullanıcının giriş dizini veya bu kullanıcı yoksa, yalnızca adlandırılmış bir dizindir ~foo.


Dolayısıyla, içinde:

scp ~Desktop/Volenteer.png     jay@server.ip:~j0h/b

~DesktopDesktopeğer böyle bir kullanıcı varsa (ve genellikle bulunmuyorsa) ya da sadece ~Desktop(genellikle bulunmayan bir yol ) ise , kullanıcının ana klasörüne genişleyecektir .


İçinde:

scp ~/Desktop/Volenteer.png     jay@server.ip:~/j0h/b

~/j0hadlı bir dizine genişleyecektir j0hiçinde jayyine var olmaya olası değildir bireyin ana dizine.


Fark değil ~ve ~/nerede meydana gelir, ama ~ve ~foo.


Ayrıca, ~dizin geçmişi gezinti için de kullanılabilir:

  • ~-(gibi önceki çalışma dizinidir $OLDPWD)
  • ~+geçerli çalışma dizini (benzeri $PWD)

Bunun için geçerli değildir scp, çünkü bir ortadaki dizinleri değiştiremezsiniz.scp işlemin .

Ve eğer bir dizin yığını kullanmak pushdvepopd korumak için, ve çıktıda görüldüğü gibi, dizin yığını içindeki inci dizin olur . olacaktır (her iki durumda da sıfırdan sayma) ucundan inci dizin. Örneğin:~N~+NNdirs~-NN

$ for i in etc usr var tmp; do pushd /$i; done
/etc ~/.vim
/usr /etc ~/.vim
/var /usr /etc ~/.vim
/tmp /var /usr /etc ~/.vim

$ dirs
/tmp /var /usr /etc ~/.vim

Daha sonra, yığıntaki dizinlere aşağıdakiler kullanılarak erişilebilir:

/tmp /var /usr /etc ~/.vim
  ~0   ~1   ~2   ~3     ~4
 ~+0  ~+1  ~+2  ~+3    ~+4
 ~-4  ~-3  ~-2  ~-1    ~-0 
  ~+   ~-

Yani, ~+her zaman .o zaman eşdeğerdir , bu doğru mu? Gereksiz görünüyor.
Wildcard,

1
@Wildcard iyi, tam olarak değil. ~+ve mutlak yollar olan ve ~-değerlerini kullanın . her zaman göreceli bir yoldur. Dolayısıyla, yürürlükteki çalışma dizinini çalıştırırken değiştiren bir komut varsa , genişleyen yolun aynı kalacağı yeni yolunu görecektir. bir örnek, itiraf etsem de bunun için iyi bir kullanım düşünemiyorum . Tırnak işareti gerekmez hariç, sadece iyi olarak döneceği eğer boşluklar içeriyor. $PWD$OLDPWD..~-tar -C~+$PWD~+/foo/bar$PWD
muru

1
Teşekkürler, açıklığa kavuşturuyor. Aslında bu iyi bir örnek kullanım örneğidir: Bazı komutlar güvenlik nedeniyle göreceli yollarda çalışmayı reddeder; Bu tür komutlarla kullanamazsınız ./filenameama kullanabilirsiniz "$PWD/filename"veya daha basit ~+/filename. (Ve bazı komutlar göreceli yol adları üzerinde çalışacaktır , ancak lnya da gibi işlevsel bir fark vardır tar.)
Wildcard

21

Bash Tilde Expansion'ın GNU belgelerini okudum (bu cevabı ilk tekrarlamamdan önce almam gerektiği gibi).

~/Desktopve ~j0hneden ~Desktopişe yaramadığını açıklayan temelde farklı şeyler yapıyorlar :

  • Oturum açmak için ayarlanmış, ~geçerli $HOMEortam değişkeniniz için bir ova kullanılır . Böylece benim için ~çözer /home/olive olarak ~/Desktopokur /home/oli/Desktop. Tilda'nın en çok kullanıldığını gördüğünüz yer burası.

  • ~usernameAyarlandığı gibi o kullanıcının ana sayfasını çözer /etc/passwd. Yani ~oligiderir için /home/oli, ~j0hçözümlemek olabilir /home/j0hancak merdivenler, senin homedir herhangi bir yerde olabilir.

  • ~not-a-usernameçözmüyor Çünkü Desktopbir kullanıcı ~Desktopdeğil, yerine geçmemiş. Kelimenin tam anlamıyla ~Desktop(burada bulunmayan) adlı bir dosya veya yol olarak alınmıştır .

Söylemeye gerek yok, bunların hepsi uzaktan oluyor ( scpyerel değerlerle değiştirildiyse işe yaramaz ). Bu işe yarıyor, çünkü Bash ~...boşluktan başka bir şeyden önce gelirse yerini almayacak .


Ne getent passwd bindiyor?
muru

2
"bin", çoğu Linux makinelerinde, / bin 'in ana dizini olan bir sistem kullanıcısıdır.
fNek

1
Genişletme başarısızlığı ~dirGNU dokümanlarıyla tutarlıdır: "... tilde sonrasında tilde önekindeki karakterler olası bir giriş adı olarak değerlendirilir ... Giriş adı geçersizse veya tilde genişletmesi başarısız olursa, kelime değişmeden kaldı. " İşte, dirbu sistemdeki bir kullanıcının adı değil, bu yüzden değişmeden bırakıldı.
apsillers 14

Herkese teşekkürler. Muhtemelen
gönderdiğim

4

Sembol ~, /home/useriçinde kısayol olarak kullanılır bash, bu yüzden ~/Desktop/Volenteer.pngkısacası için kullanılır /home/user/Desktop/Volenteer.png.

Gördüğünüz gibi /, her zaman olduğu gibi, dosya sistemi hiyerarşisinde yeni bir seviye gösterir.


3
sadece yarısı sağ, $ HOME ortam değişkeni için bir steno. ~{user}/passwd (5) veritabanı dosyası tarafından belirlenen herhangi bir rasgele yol olabilir. Evet, filesytem.org standartları normal kullanıcıları / evlerine yerleştirir, bu her kullanıcının durumu değildir (örn. Root / / root ve / var / ... veya / homer kullanarak / usr kullanan daha yaşlı unix'lerdeki hizmetler)
Dwight Spencer,

DwightSpencer doğru. Kullanıcıların / usr / {CLIENTNAME} / home / içinde olduğu ve birkaç iç ve uzak sistemde (hepsi bu dizinin üzerine geldiği) paylaşıldığı birkaç sunucuyu korudum, bu yüzden sadece 1 sistemin korunmasına ihtiyacım var. Ve ~ bu dizine işaret eder;)
Rinzwind

3
@ Rinzwind eek. Bu kutsal kötüye kötüye kullanımı protesto etmeliyim /usr.
muru,

@muru hey bu benim aramam değildi>: - D
SCO'dan

1
Dürüst olmak gerekirse, her şeyden önce kullanıcı için / usr'ın kullanımını beğendim, çünkü orijinal olarak kastediyorum. Bugünlerde bulduğum şey, / usr / bin'in temel binutils dışındaki tüm ikili dosyaların (sys, user, sysop) büyük birleşik bir çöplük alanı olarak kötüye kullanılmasıdır. Tüm / usr, kullanıcıların tüm nfs mount'lardan erişebildiği şeyleri ifade ederken, / usr / local, sysop binaries ve / bin system binaries olarak / sbin içeren yerel kullanıcı alanıydı. Anladığım kadarıyla / home farklı bir bölüm olabilir ama / usr / home / ... onu / usr içinde tutmak hem politika, uygulama hem de zihniyette kullanıcı ad alanı olarak tutar.
Dwight Spencer

3

~ çevre değişkeni kısaca $HOMEÇoğu c kabuk türevi / destekleyen POSIX uyumlu mermi üzerindeki . En yaygın kullanım ~alanı, kendi giriş dizininize veya başka bir kullanıcının girişine referansta bulunmaktır:

cd ~ # ie shell, take me to my home folder

cd ~root # i.e. shell, take me to root's home folder

Herhangi bir yerel kullanıcının giriş dizinini, POSW sistemindeki (UNIX, Linux, OS X, BSD), passwd (5) veritabanını kullanan, bunun gibi işleyen bir dizinde bulmak için /etc/passwd:

awk -F: '{ print $1,$(NF-1) }' /etc/passwd

Bu her yerel kullanıcıyı ve giriş dizinini listeler.

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.