Bunun daha önce sorulduğunu biliyorum, ancak Google’da bulamadım.
verilmiş
- Linux çekirdeği
- $ HOME değiştiren yapılandırma yok
- darbe
Will ~ == $HOME
doğru?
echo "~"
ve echo "$HOME"
.
~
ya $HOME
. : P
Bunun daha önce sorulduğunu biliyorum, ancak Google’da bulamadım.
verilmiş
Will ~ == $HOME
doğru?
echo "~"
ve echo "$HOME"
.
~
ya $HOME
. : P
Yanıtlar:
Anlaşılması gereken şey, ~
genişlemenin kabuğun (bazı mermilerin) bir özelliği olması, kullanıldığı dizinde kullandığınız ana dizinden ziyade sihirli bir karakter değildir.
Genişletilir (komut satırlarını yorumlamak için kullanılan bir uygulama olan kabuk gibi), $var
komut çalıştırılmadan önce bir kabuk komut satırında kullanıldığında bazı koşullar altında değerine genişletilir.
Bu özellik ilk olarak 1970'lerin sonunda C-kabuğunda ortaya çıkmıştı (Bourne kabuğu ona sahip değildi, ya da selefi Thompson kabuğuna sahip değildi), daha sonra Korn kabuğuna (Bourne kabuğuna daha yeni bir kabuk üzerine inşa edilmiş) ilave edildi. 80s). Sonunda POSIX tarafından standardize edilmiştir ve artık POSIX dışındakiler de dahil olmak üzere çoğu kabukta mevcuttur fish
.
Kabuklarda bu kadar yaygın kullanımda olduğundan, bazı kabuk dışı uygulamalar da onu ana dizinin anlamı olarak tanır. Bu onların yapılandırma dosyaları veya birçok uygulamaların durum kendi komut satırında ( mutt
, slrn
, vim
...).
bash
özellikle (GNU projesinin kabuğu olduğu ve birçok Linux tabanlı işletim sisteminde yaygın olarak kullanılan), çağrıldığı zaman sh
, çoğunlukla POSIX kurallarının~
genişlemeyle ilgili kurallarına uyar ve POSIX tarafından belirtilmeyen alanlarda, çoğunlukla Korn kabuğu gibi davranır ( bu bir parça klonudur).
İken $var
(iç tek tırnak hariç) çoğu yerde genişletilir, ~
genişleme, sonradan sadece birkaç belirli koşullarda genişletilir ediliyor.
Liste bağlamlarında, bir dizgenin beklendiği bağlamlarda kendi argümanında genişletilir.
İşte nerede genişlediğine dair birkaç örnek bash
:
cmd arg ~ other arg
var=~
var=x:~:x
(POSIX tarafından istenen PATH
, MANPATH
... gibi değişkenler için kullanılır .)for i in ~
[[ ~ = text ]]
[[ text = ~ ]]
( ~
AT&T'de bir model olarak alınmasının genişlemesi ksh
ancak bash
4.0'dan beri değil ).case ~ in ~) ...
${var#~}
(bazı diğer kabuklarda olmasa da)cmd foo=~
(ancak, çağrıldığında değil sh
, yalnızca sol tarafındakiler =
kote edilmemiş bir bash
değişken adı şeklinde olduğunda )cmd ~/x
(açıkça POSIX tarafından istenmektedir)cmd ~:x
(ama değil x:~:x
veya x-~-x
)a[~]=foo; echo "${a[~]} $((a[~]))"
(diğer bazı kabuklarda değil)İşte genişlemediği birkaç örnek:
echo "~" '~'
echo ~@ ~~
(Ayrıca ~u
, kullanıcının ana dizinine genişletmek gerektiğini unutmayın u
).echo @~
(( HOME == ~ ))
, $(( var + ~ ))
extglob
: case $var in @(~|other))...
(olsa case $var in ~|other)
Tamam)../configure --prefix=~
( --prefix
geçerli bir değişken adı olmadığı için)cmd "foo"=~
(içinde bash
tırnak işaretleri nedeniyle).sh
: export "foo"=~
, env JAVA_HOME=~ cmd
...Neye genişlediğine gelince: ~
tek başına HOME
değişkenin içeriğine veya ayarlanmadığında, hesap veritabanındaki geçerli kullanıcının giriş dizinine genişler (POSIX'in bu davranışı tanımsız bırakmasından bu yana bir uzantı olarak).
Bu unutulmamalıdır ki ksh88 ve bash
sürümleri 4.0 için önce, genişleme liste bağlamlarda (dosya adı nesil) globbing uygulandı tilde:
$ bash -c 'echo "$HOME"'
/home/***stephane***
$ bash -c 'echo ~'
/home/***stephane*** /home/stephane
$ bash -c 'echo "~"'
~
Bu olağan durumlarda bir sorun olmamalıdır.
Genişletildiği için, aynı uyarının diğer genişletme şekilleri için de geçerli olduğunu unutmayın.
cd ~
Eğer Çalışmaz $HOME
ile başlar -
veya içerdiği ..
bileşenler. Bu yüzden, herhangi bir fark yaratmanın pek mümkün olmamasına rağmen, kesinlikle şunu söylemek gerekir:
cd -P -- ~
Ya da:
case ~ in
(/*) cd -P ~;;
(*) d=~; cd -P "./$d";;
esac
( ,, ... $HOME
gibi değerleri kapsayacak şekilde ) veya-
+2
cd
( cd
sizi herhangi bir tartışma olmadan ana dizininize götürür)
Diğer mermilerde daha geniş ~
açılımlar var. Örneğin zsh
, biz var:
~4
, ~-
, ~-2
(Tamamlama) dizin yığınında dizinleri (eğer ettik yerler genişletmek için kullanılan cd
önce kadar).~something
genişletileceğine karar vermek için kendi mekanizmanızı tanımlayabilirsiniz .Herhangi bir sistemde Bash'in herhangi bir versiyonunda, evet . ~
tek başına bir terim olarak genişlemeye tanımlanır:
$ HOME değeri
bu yüzden her zaman $HOME
mevcut kabuğa ne olursa olsun aynı olacaktır . Orada gibi diğer bazı tilde açılımları vardır ~user
için user
bireyin ana dizine, ancak tek bir tırnaksız ~
kendi başına her zaman genişleyecek "$HOME"
.
O Not davranışı arasında ~
ve $HOME
bazı durumlarda farklı olabilir: özellikle, eğer $HOME
boşluk (ya da diğer içeren IFS karakterleri), sonra $HOME
ise (tırnaksız), birden fazla kelimenin genişleyecek ~
her zaman tek kelimedir. ~
eşit olarak genleşir "$HOME"
(alıntı yapılan).
Özel sorunuzla ilgili olarak:
[[ $HOME == ~ ]]
her zaman doğrudur, çünkü sözcük bölmeyi [[
bastırır . [[ ~ == $HOME ]
eğer olmayabilir HOME
sahiptir desen eşleştirme içinde karakterleri, ancak [[ ~ == "$HOME" ]]
(yani alıntı "$HOME"
) her zaman doğrudur. Tek parantez içinde kullanmak HOME
, boşluk içeren ya da özel karakterlerin değerleri için sözdizimi hatası olabilir . Her mantıklı ana dizin yapılandırma için ~
ve "$HOME"
aynı ve eşit olarak karşılaştırın.
Stéphane Chazelas, yorumlarda farklı değerlerin verildiği ~
ve verildiği bir durumu not etti $HOME
: eğer öyleyse unset HOME
, ~
Bash'i kullandığınızda getpwuid
şifre veritabanından bir değer okumak için arayacaksınız . Bu durum, yapılandırma değişikliği yapmamanız koşuluyla hariç tutulur $HOME
, ancak burada tamlık için bahsedeceğim.
/bin/sh
olmayabilir bash
. Posix sh
teknik özelliklerinden bahsettiğinden emin değilim~
~
. ~
Thomson veya Bourne kabuğundaki değildi (zamanlarında olduğu gibi /bin/sh
). İçinde rc
veya türevlerinde değil (başka bir şey için kullanıldığı yerde)
bash
eğer HOME
ayarlanmazsa, ~
passwd veritabanından kullanıcının ev dizinine şekilde genişler. Yani bu ~
, değerine genişlemeyebilecek bir durum $HOME
.
bash
bash4 tilde genişlemesi (deneyin üzerine globbing gerçekleştirmek için kullanılan önce HOME='/*' bash -c 'echo /*'
). Yani HOME=/*; [ "$HOME" = ~ ]
orada bir hata dönecekti.
get_current_user_info
, hangi kullanan getpwuid
tüm platformlarda ama Tandem üzerinde .
~
buna eşdeğer olacağına inanıyorum$HOME
; ama yanılıyor olabilirim.