Pwd sonucunu “~” cinsinden yap?


28

pwd bana verir

/data/users/me/some/random/folder

Elde etmenin kolay bir yolu var mı

~/some/random/folder

dan pwd?


Sed aracılığıyla borulama bir seçenek midir?
Matthew D. Scholefield

7
Bunu yapacaksanız , elde edilen komutu başka bir şekilde adlandırmanızı şiddetle tavsiye ederim pwd. Aksi takdirde, çıktısını tilde genişlemesi yapmayan bağlamlarda kullanmayı bekleyen komut dosyalarını kıracaksınız.
Charles Duffy

Yanıtlar:


25

Eğer bash kullanıyorsanız, o zaman dirsyerleşik istenen davranışa sahiptir:

dirs +0
~/some/random/folder

(Not +0, değil-0 .)

İle zsh:

dirs
~/some/random/folder

Tam olarak, önce dizin yığınını temizlememiz gerekir, aksi dirshalde tüm içerikleri yazdırırız:

dirs -c; dirs

Veya ile zshbireyin printyerleşiğini:

print -rD $PWD

veya

print -P %~

(bir döndüğünü istemi genişlemeyi . üzerine %~de $PS1cari dizine genişletir $HOMEile değiştirilir ~aynı zamanda diğer kolları adlı dizinleri diğer kullanıcılar veya ev dizininin gibi adlandırılmış dizinleri kendini tanımlamak o).


Ben bash ve zsh arasında her zaman değiştiriyorum. Ne yazık ki bu çözüm beni kabukları arasındaki farkı hatırlamaya ve şu anda nerede olduğumu hatırlamaya (kontrol etmeye) zorluyor. @Bichoy tarafından cevap bu ikisi için kabuk-agnostik.
avp

18

Bash değişken alt dize değiştirme özelliğini kullanabilirsiniz:

$ pwd
/home/vagrant/foo/bar
$ echo ${PWD/#$HOME/'~'}
~/foo/bar

2
Bu da kshve içinde çalışır zsh.
mr.spuratic

1
Bu cevabı yükseltmiş olmama rağmen, en kolay yolu, burada küçük bir uyarı var: inside / tmp / home / username, bu geri dönecek / tmp ~. Bunu düzeltmek için $ HOME'dan önce bir işaret işareti yerleştirmenin bir yolunu bulamıyorum. Çözümünüzün mükemmel olması için ihtiyacınız varsa, bunu kullanmayın ...
0fnt

1
@ user18151, bunu işaret ettiğinizden daha. ${string/#substring/replacement}Bu davranışı önlemek için cevabımı sürümüne değiştirdim .
Nykakin

1
@ mr.spuratic o (kullanım hariç yalnızca doğru olduğunu echocinsinden) zsh. Diğer kabuklarda, $HOMEdesen olarak ve her şey split + glob'a tabi tutulur.
Stéphane Chazelas

Tilde kaçan ('~') numarayı yaptı. Bunun da işe yaradığını unutmayın. Bu zaten 'konteks içinde olduğunda uygundur: örneğin,PROMPT_COMMAND='printf "\033]0;%s@%s:%s\007" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/\~}"'
Atafar

7

Kullanarak sed:

pwd | sed "s|^$HOME|~|"

Fikir, ev dizini yolunda sedregex'te sınırlayıcı olarak görünmesi daha az olası olan herhangi bir karakteri kullanmaktır . Yukarıdaki örnekte kullanıyorum |.

Bu teknikle ilgili en iyi şey aslında kabuğundan bağımsız olmasıdır.

Ayrıca bu davranışı kullanmak için kullanılabilecek diğer komut dosyalarında kullanmak için takma ad pwdda /bin/pwd | sed "s|$HOME|~|"kullanabilirsiniz pwd.


2
^Çapanı regex'inize eklemeniz gerekir . Aksi takdirde, bunun yolun ortasındaki bir parçayı değiştirmesi mümkündür (ancak olası değildir).
Sildoreth

Aslında regex aşağıdaki gibi görünmelidir "s|^/home/user\(/.*\)\?$|~\1|". İsimleri gibi eğer Aksi takdirde diğer kullanıcıların yolları maçları user1, user2, user3ve sadece maçuser
AVP

3
tilde=\~${PWD#~}

Sanırım istediğin bu mu?

Tilde ilişkin düzgün olan şey, bir desen olarak genişletildiği zaman alıntı yapması gerekmiyor. $HOMETırnak işaretleri olmadan aynı şekilde kullanılması , öngörülemeyen karakterlerin herhangi biri desen karakterleri olabileceği için öngörülemeyen sonuçlar doğurabilir ve bu nedenle sonucu her zaman beklenen şekilde vermeyebilir.

Ancak, tilde genişleme, her zaman alıntılanmış bir genişlemenin sonucuymuş gibi gerçekleşeceğinden ortaya çıkar ve sonuçları tahmin edilebilirdir. Bu, hem casekalıplar hem de parametre kalıplar için, her ikisinin de kayda değer istisnaları dışında ksh93ve mkshne nedenle olursa olsun test ettiğim her kabukta gerçek gibi gözüküyor.

Bununla ilgili bir başka temiz şey de, $HOMEherhangi bir dizini aynı şekilde ele almak için yeniden tanımlayabilmenizdir . Örneğin:

cd ~
HOME=/some/prefix/I/would/like/to/trim 
#or, perhaps more usefully, some scripted means of arriving at same
tilde=\~${OLDPWD#~}
HOME=$PWD

İşte başka bir örnek:

set 1 2 3 4 5 \~
cd ~; cd -; HOME= IFS=/
for d do shift
      HOME=${*#~/}/$d
      set ~ "$d" $HOME
done; cd -; HOME=$PWD
printf %s\\n "$@"
5/4/3/2/1/2/3/4/5/~/1/2/3/4/5/~
~
5
4
3
2
1
2
3
4
5
~
1
2
3
4
5
~

1
Bu gerçekten ilginç bir yaklaşım. Ancak bunun $PWDaltında olduğunu varsayar $HOME. Aynı fikri desen değiştirme ile birleştirerek daha genel hale getirmek için kullanabilirsiniz. Nasıl ${PWD/#~/\~}?
Mikel

1
Aslında Nykakin'in cevabı temelde budur.
Mikel

0

İstenmeyen kısmı değiştirmeyi deneyebilirsiniz sed:

pwd | sed 's,^/data/users/me,~,'

veya daha da iyisi:

pwd | sed "s,^$HOME,~,"

1
^Yalnızca dizin yolunun başlangıcındaki eşleşmelerin değiştirildiğinden emin olmak için bağlantıyı kullanmanız gerekir . Ayrıca, gkomut en fazla 1 tekrarlamanın yerini alması gerektiğinden kullanmanız gerekmez .
Sildoreth

Teşekkür ederim. Ben hala bu şeyleri öğreniyorum ve yorumunuz gerçekten çok yardımcı oldu.
user1403360

Ana dizim /home/aliceve mevcut dizim ise sorunlu /home/aliceinchains. Ancak, özelliği kullanmak istediğim tek zaman, ana dizinin ya da alt dizinlerinden biri olduğumu bildiğim zaman, işe yaramalı.
Mihai Danila,
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.