Başka bir kısayol `~~` gibi `~` (giriş dizini) oluşturun


10

~~Kısayol olarak kullanabilmek için farklı bir dizine işaret etmek istiyorum . Onunla tam olarak aynı işlevlere sahip olmasını istiyorum ~. Bunu nasıl yapabilirim?



Soruna ilginç bir çözüm buldum superuser.com/a/565825/398328
VarunAgw

1
@VarunAgw haha, Komik bul, aynı çözümü düşündüğüm gibi. Utanç. Bir dakikalığına eşsiz bir kelebek olduğumu düşündüm :(
Gravy

Yanıtlar:


14

Aslında, bir yol var, bu harika bir yol değil, ama bir yol, haha!

/etc/passwdDosyanıza aşağıdakileri ekleyin :

~:x:1111:99:special Character user:/test:/sbin/nologin

yerine 1111değiştirin mantıklı bir şey ile UID olarak /testsize mimik etmek ~~ istediğiniz dizine ile.

99sistemimde, nobodybunu kullanacak herhangi bir dosyada NO izinlerine sahip bir grup olduğundan emin olmak için bunu yaparsanız tavsiye ettiğim gruptur. Teorik /sbin/nologinolarak kabuk olarak kullanılmamalı, ayrıca bir /etc/shadowgirişi olmayacak, bu yüzden bir şifresi olmayacak. Teorik olarak iyi olmalı, ancak bir şekilde hesap olarak giriş yapmanıza izin vermediğinden emin olun.

Bir yan not olarak: Hiçbir şekilde bunun iyi bir fikir olduğunu söylemiyorum, ancak istediğiniz işlevselliği başaracak.

DÜZENLEME: tamlık hatırına bu VarunAgw tarafından önerilmiş: Sen normal olarak kullanıcı eklemek olabilir useradd -s /sbin/nologin -N tmpve daha sonra değiştirmek /etc/passwdve /etc/shadowkullanıcıyı değiştirmek tmpiçin ~ve konumunu değiştirmekhome directory


Bunun yerine UID ve GID değişen, sadece olabilir useradd 'tmp've daha sonra değiştirmek tmpile~
VarunAgw

Doğru. iyi bir öneri. Ben bir shadowgiriş ile onu meşrulaştırma hakkında nasıl emin değilim ama hiçbir şifre gerçekten ek bir risk olarak ayarlanmış sürece varsayalım.
Gravy

8

CDPATH'den yararlanabilir ve ~~ CDPATH bileşenlerinizden birine tam anlamıyla adlandırılmış bir dizin koyabilirsiniz .

Gönderen man bash(ancak CDPATH bile kullanılabilir sh)

Cd komutu için arama yolu. Bu, kabuğun cd komutu tarafından belirtilen hedef dizinleri aradığı iki nokta üst üste işaretli dizinlerin listesidir. Bir örnek değer ".: ~: / Usr" şeklindedir.

Bu yapmanıza izin verecektir cd ~~.

vi ~~/someFileDizin ağacının herhangi bir yerinden gibi şeyler yapmak istiyorsanız ~~, kabuğunuzu hacklemediğiniz sürece tam anlamıyla ısrar ediyorsanız şansınız kalmaz , ancak sihirli dizinlerinizi saklamak için değişkenleri veya ortam değişkenini kullanabilirsiniz. , Örneğin,$tilda/someFile

Ben gibi yolları ile erişilebilecek şekilde Genellikle benim ev dizininde içeride sık erişilen dosyaları kısaca adlandırılmış dizinleri koymak ~/bveya ~/l.

Doğal olarak, dizinleri genellikle dizinlere sembolik işaretlerle değiştirebilirsiniz.


1

Kabuğun ~tilde genleşmesi çoğunlukla programlanabilir. Sondaki bağlamında bildirilen sistem kullanıcı adının kullanıcı dizinine (ve bu satırlar boyunca mükemmel bir çözüm zaten teklif edilmiştir) , $HOMEkabuk değişkeninin değerine ya da hiç olmamasına kadar genişler .

Yani:

(HOME=/tmp; cd ~)
pwd; echo "$HOME"

/tmp
/home/mikeserv

Her $HOMEzaman değiştiririm ve bir işlevi sıfırlamak için kabuğumun ortam dosyasında tutarım:

home(){
    HOME=~$USER
    cd ~; pwd
}

~Tilde değerini ana dizininize gönderme yapmayacak bir şekilde kullanmak istiyorsanız , bunu yapın . Sadece yeniden ata $HOME. Bundan korkma. $HOMEdiğerleri gibi bir kabuk değişkenidir.


Sahip olduğum başka bir öneri, @ PSkocik'in kullanımı hakkında mükemmel tavsiyesinde sadece hafif bir genişleme $CDPATH. Bununla birlikte, bahsetmediği bir şey $CDPATH, mevcut kabuk değerini hiç değiştirmeden satır içi kullanabilmeniz ve değiştirebilmenizdir $CDPATH. Örneğin:

mkdir -p /tmp/1/2
CDPATH=/tmp cd 1/2

/tmp/1/2

cdzorunlu olarak bir kabuk yerleşiktir, ancak POSIX özel kabuk yerleşik değildir ve bu nedenle değerini bildirmek $CDPATHgeçerli kabuk değerini etkilemez. Eğer yukarıdaki gibi yaptığım $CDPATHdeğeri sadece bir cdkomutun ortamı için değiştirilir ve daha sonra önceki değerine geri yüklenir. Yukarıdaki tekniği tarihin tamamlanmasıyla birlikte kullanıldığında en yararlı buluyorum. Yukarıdaki şeyi yapacağım, bir dizine geçeceğim, birkaç komut çalıştıracağım, daha sonra cdkomutuma geri dönüp başka bir yere taşımak için bir ya da iki yol parçasını geri alana kadar yukarı basacağım.


Şimdi bu iki kavramı birleştirirseniz, daha önce kullandığınız bir komutu bir sonraki kullanışınızda tamamen farklı bir şey ifade edebilirsiniz.

for HOME in /tmp ~
do  mkdir -p ~/1/2
    CDPATH=~ cd 1/2
done

/tmp/1/2
/home/mikeserv/1/2

0

Bir bash işlevi olarak mükemmel çalışır:

$ function ~~ { cd /tmp; }
$ pwd
/home/jackman
$ ~~
$ pwd
/tmp
$ cd -
$ pwd
/home/jackman

İşte biraz daha yaklaşan başka bir yaklaşım (Gereksinimlere yaklaşmadığımı biliyorum)

function ~~ { echo /test; }

Sonra birkaç karakter daha:

cd `~~`/subdir
vi `~~`/file

2
Eh, cd ~~/foo/baro kadar iyi çalışmayacak, ya da vim ~~/foo.txt, vb ...
derobert

1
Soru belirsiz. İstenilen kullanım buysa CDPATH, cddavayı işlemek için değişkeni kullanırdım .
glenn jackman

Tamamen net olmadığını kabul ediyorum, ancak OP bunun gibi çalışmasını istiyor ~. Ve ~bir komut gibi kullanılmaz.
derobert

Tamamen hecelenmediyse, kendimi oldukça anlaşılabilir buldum. Sorun CDPATH.... CD dışındaki komutlar için çalışmıyor olmasıdır. IE yapabildin cd ~~ya cd ~~/testdir1ama yapamadımvim ~~testdir1
Sos

işlevi çağıran bir takma adla daha iyisini yapabilirsiniz. likealias cd~='HOME=$OTHER_HOME; home(){ cd -- "$1"; HOME=~$USER; unset -f home;}; home '
mikeserv
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.