pwd bana verir
/data/users/me/some/random/folder
Elde etmenin kolay bir yolu var mı
~/some/random/folder
dan pwd?
pwd. Aksi takdirde, çıktısını tilde genişlemesi yapmayan bağlamlarda kullanmayı bekleyen komut dosyalarını kıracaksınız.
pwd bana verir
/data/users/me/some/random/folder
Elde etmenin kolay bir yolu var mı
~/some/random/folder
dan pwd?
pwd. Aksi takdirde, çıktısını tilde genişlemesi yapmayan bağlamlarda kullanmayı bekleyen komut dosyalarını kıracaksınız.
Yanıtlar:
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).
Bash değişken alt dize değiştirme özelliğini kullanabilirsiniz:
$ pwd
/home/vagrant/foo/bar
$ echo ${PWD/#$HOME/'~'}
~/foo/bar
kshve içinde çalışır zsh.
${string/#substring/replacement}Bu davranışı önlemek için cevabımı sürümüne değiştirdim .
echocinsinden) zsh. Diğer kabuklarda, $HOMEdesen olarak ve her şey split + glob'a tabi tutulur.
PROMPT_COMMAND='printf "\033]0;%s@%s:%s\007" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/\~}"'
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.
^Ç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).
"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
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
~
$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/#~/\~}?
İstenmeyen kısmı değiştirmeyi deneyebilirsiniz sed:
pwd | sed 's,^/data/users/me,~,'
veya daha da iyisi:
pwd | sed "s,^$HOME,~,"
^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 .
/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ı.