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 dirs
yerleş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 dirs
halde tüm içerikleri yazdırırız:
dirs -c; dirs
Veya ile zsh
bireyin print
yerleşiğini:
print -rD $PWD
veya
print -P %~
(bir döndüğünü istemi genişlemeyi . üzerine %~
de $PS1
cari dizine genişletir $HOME
ile 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
ksh
ve içinde çalışır zsh
.
${string/#substring/replacement}
Bu davranışı önlemek için cevabımı sürümüne değiştirdim .
echo
cinsinden) zsh
. Diğer kabuklarda, $HOME
desen 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 sed
regex'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 pwd
da /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
, user3
ve 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. $HOME
Tı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 case
kalıplar hem de parametre kalıplar için, her ikisinin de kayda değer istisnaları dışında ksh93
ve mksh
ne nedenle olursa olsun test ettiğim her kabukta gerçek gibi gözüküyor.
Bununla ilgili bir başka temiz şey de, $HOME
herhangi 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
~
$PWD
altı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, g
komut en fazla 1 tekrarlamanın yerini alması gerektiğinden kullanmanız gerekmez .
/home/alice
ve 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ı.