Tilde, göreceli bir yol olarak kabul edilir mi?


35

Nvidia cuda kütüphane kurulumunun farklı bölümünü çıkarmaya çalışıyorum. Aşağıdaki komutu kullanıyorum:

mkdir ~/Downloads/nvidia_installers
./cuda_6.5.14_linux_64.run -extract=~/Downloads/nvidia_installers

Ve şu mesajı alıyorum:

ERROR: extract: path must be absolute.

Ve emirleri evimin değişmez adresi ile yazdığımda mükemmel çalışıyor.

./cuda_6.5.14_linux_64.run -extract=/home/likewise-open/XXX/username/Downloads/nvidia_installers

Kafam karıştı / home / aynı şekilde open / XXX / username ile aynı olmamalı mı?

Test:

./cuda_6.5.14_linux_64.run -extract=$HOME/Downloads/nvidia_installers

ve işe yarıyor ama neden izin vermediğini bilmiyorum ~


2
İlgili: "Bir" tilde-öneki ", bir kelimenin başlangıcında yer alan bir
tırnak işareti içermeyen

Yanıtlar:


47

Bash, sadece bir kelimenin başlangıcı ise ~ genişletir. Bunu aşağıdaki komutlar arasında görebilirsiniz:

$ echo -extract=~/test
-extract=~/test

oli@bert:~$ echo -extract ~/test
-extract /home/oli/test

Bash bağımsız ~karakterler ve ~/bu ikame için arar . Başka hiçbir kombinasyon veya alıntılanan sürüm çalışmaz.

$HOMEçünkü değişken ikameler daha sağlamdır ( $özel bir karakterdir, oysa ~çok daha azdır):

$ echo Thisisastring${HOME}awrawr
Thisisastring/home/oliawrawr

Biz konuşurken ~, aslında başka ikame kullanım çiftleri var:

  • ~+mevcut çalışma dizini (okunan $PWD)
  • ~-Bir önceki çalışma dizini (okunan $OLDPWD)

Düz ile olduğu gibi ~, bunlar uçta taranan ek yollar olabilir ve yine bunlar bir kelimenin öneki olmalı ya da Bash onları görmezden gelecektir.

Bu konuda daha fazla okuyabilirsiniz man bash | less -p ' Tilde'


2
Bu fazlalaştı zsh yok (ya da daha doğrusu şekilde yapılandırılabilir) genişletmek ~sonra =da. Diğer elverişli gelişmeler arasında bash fazlası var.
Jan Hudec

@JanHudec Hayır - daha karmaşıktır; Sonrası genişlemekle ilgili değil =; Bir değişken atamasının sağ tarafındaki başlangıcında genişlemekle ilgilidir. Bu, yakından bakarken davamızı biraz daha kafa karıştırıcı hale getiriyor - cevabımı görün. Ve zshbundan farklı değil bash; 'Zsh' için açıklama biraz şifreli: info --subnodes zsh | less +/'14.7.4 Notes'(zsh man sayfaları eksik)
Volker Siegel

1
@ VolkerSiegel: zshçok yapılandırılabilir. Benim zsh içinde echo -extract=~/testsonuçlanır -extract=/home/user/test. MAGIC_EQUAL_SUBSTSeçenekler tarafından etkinleştirilir . Bir yan notta, tüm zsh man sayfalarına bakarım.
Jan Hudec

@JanHudec zshYapılandırılabilir olmaktan hiç şüphe yok - ve diğer iyileştirmeler; MAGIC_EQUAL_SUBST'ın (14.7.4'te ele alınmıştır) varsayılan olarak ayarlanmadığını ve nadiren kullanıldığını; Şimdi, eğer genel olarak etkinleştirdiyseniz, açıkça daha alakalı. Örnek bölümümü iyi bir şekilde elde ettikten sonra, bu iyi bir ek olur ...
Volker Siegel

@JanHudec Zsh man sayfalarına gelince, bir süre Ubuntu paketlerinden eksiklerdi, ipucu için teşekkürler, düzeltildiğini bilmiyordu; Böceğe bakıldığında, ütopik için sabit, ancak güvenilir değil - bu açıklar! ( launchpad: tüm zsh manpages ve satır içi yardım dosyaları eksik ve AU: zsh man eksik ... )
Volker Siegel

19

Sadece tamir ediyorum

Bu komut "ERROR: extract: path mutlak olmalıdır" hata mesajını gösterir:

./cuda_6.5.14_linux_64.run -extract=~/Downloads/nvidia_installers

Hata yararlı değil - program zaten çok karışıktı.
Hatanın, ~bununla çalıştığı şekliyle olduğunu zaten biliyorsunuz $HOME.

Sorun: ~sadece bir kelimenin başlangıcında değiştirilir.

Örneğin, bu tilde ile çalışır:

echo -extract ~/Downloads

Seçenek sözdizimine ihtiyacınız varsa =, yerine $ HOME kullanmak ~en temiz çözümdür;

echo -extract=$HOME/Downloads

Pratik

Bilmen gereken:

~Bir kelimenin başında değilken genişlemenin genişletildiği özel durumlar vardır : değişken atamasının bir parçası olarak, hemen ardından =. Tabii ki burada kafa karıştırıcı.

Diğer önemli özel durum ise PATH gibi değişkenlerle kullanım içindir. Değişken atamalarında, ~ilkinden sonraki :gibi, sonra da genişletilir =.

$ dir=~ sh -c 'echo D2: $dir'
D2: /home/user
$ sh -c 'echo D2: $dir' dir=~
D2: 
$ echo Dir: $dir
Dir:
$ dir=~; sh -c 'echo D2: $dir'
D2: 
$ echo Dir: $dir
Dir: /home/user
$ sh -c 'echo D2: $dir'; d3=~
D2: 
$ echo d3: $d3
d3: /home/user

Tilde anlamı

Bir kabukta, ~tilde, gerçekten bir yol değildir. Sadece bir yolla, $HOMEbazen de değiştirilir.

Kabuk tarafından sağlanan bir steno veya kısaltma gibi bir şeydir.
Genel olarak bir yol gibi kullanılamaz, kabuk sadece çok özel yerlerde bir yola "genişletir".
Ve genişletilse bile, ana dizinden başka bir şey olabilir.

  • Yalnızca bir kelimenin başında veya bir veya daha sonraki değişken atamalarında genişletilir.:=
  • Yalnızca tırnak içinde değilse genişletilir.
  • Sadece şekilde genişletilir $HOMEvarsa başka karakterler bir önceki kelimeyle/

Komut satırında sorun

Buna göre, emrindeki problem şu:

-extract=~/Downloads/nvidia_installers

genişletilmedi, çünkü listelenen durumlardan biri değil. Bu kadar.

Solüsyon bir sonraki önce başka hiçbir karakter ile, bir kelimenin ilk tırnaksız karakterine tilde yapmak olabilir /- Eğer seçenek argümanı önce bir boşluk bir seçeneği kullandığınızda ne olsun sadece geçerli:

-extract ~/Downloads/nvidia_installers

$HOMEBunun yerine başka bir çözüm kullanmak olacaktır . Bir komut dosyasında, bu genellikle daha iyi bir seçimdir.

-extract=$HOME/Downloads/nvidia_installers

Hata mesajı

Ama hata mesajı nasıl
"ERROR: extract: path must be absolute."?
tüm bunlara uygun mu?

Tilde genişlemediğini biliyoruz. Bu, programın ~, ancak /home/auseryolun olmadığı da dahil olmak üzere argüman metnini aldığı anlamına gelir . Bu yol ~/Downloads/nvidia_installers- ama şimdi kabuk yok, bu yüzden tilde özel bir anlamı yok. Bu sadece normal bir dizin adıdır. Ve formun diğer tüm yolları foo/bar/bazgibi, göreceli bir yoldur.

Diğer kullanımlar

Sonra karakterler varsa ~, olduğu gibi ~alicediğer bütün kurallara uygulayarak yukarıda - - ve bir kullanıcı adları var aliceana dizinine genişletilir, alicebunun yerine, demek home/alice.
Ayrıca, eğer bob, ~kadar genişleyip /home/bobve ~bobaynı şekilde genişleyeceği.

Varyant ~+geçerli dizine genişletilir,$PWD

Geçen önce öyleydin önceki dizine, başvurmak için cdkullanabileceğiniz ~-şekilde genişletilir, $OLDPWD.

Kullanırsanız pushdve popdyerine cd, dizin yığınının bu şekilde erişilebileceğini zaten bileceksiniz ~-2.

ayrıntılar

~Bir yola genişletilen tüm durumlar kabuk tarafından elde edilir . Diğer programlar ~için sadece normal bir dosya adı karakteridir.

İçin tam tanımı kabuk içindeki buradan ilgili bölümdür değiştirilmesi nasıl Not tarafından birçok durumda sadece bir özel durum: Bu kullanıcı ismi boşsa ise" tilde kabuk parametresi HOME değeri ile değiştirilir. " :man bash
~$HOME

Tilde Expansion
    If a word begins with an unquoted tilde character (`~'), all of the charac‐
    ters  preceding the first unquoted slash (or all characters, if there is no
    unquoted slash) are considered a tilde-prefix.  If none of  the  characters
    in  the tilde-prefix are quoted, the characters in the tilde-prefix follow‐
    ing the tilde are treated as a possible login name.  If this login name  is
    the  null string, the tilde is replaced with the value of the shell parame‐
    ter HOME.  If HOME is unset, the home directory of the user  executing  the
    shell is substituted instead.  Otherwise, the tilde-prefix is replaced with
    the home directory associated with the specified login name.

    If the tilde-prefix is a `~+', the value of the shell variable PWD replaces
    the  tilde-prefix.   If  the tilde-prefix is a `~-', the value of the shell
    variable OLDPWD, if it is set, is substituted.  If the characters following
    the tilde in the tilde-prefix consist of a number N, optionally prefixed by
    a `+' or a `-', the tilde-prefix is replaced with the corresponding element
    from  the  directory  stack,  as  it would be displayed by the dirs builtin
    invoked with the tilde-prefix as an argument.  If the characters  following
    the  tilde in the tilde-prefix consist of a number without a leading `+' or
    `-', `+' is assumed.

    If the login name is invalid, or the tilde expansion  fails,  the  word  is
    unchanged.

    Each variable assignment is checked for unquoted tilde-prefixes immediately
    following a : or the first =.  In these cases, tilde expansion is also per‐
    formed.   Consequently, one may use filenames with tildes in assignments to
    PATH, MAILPATH, and CDPATH, and the shell assigns the expanded value.

3

~kendi başına bir yol değil. Kabuktan özel muamele gören ~ya ~/da "mevcut kullanıcının giriş dizini yoluyla değiştir" anlamına gelen bir karakterdir . ~username"kullanıcı adının ana dizin yoluyla değiştir" anlamına gelir.

Bu bir yol olmadığı için, yalnızca komuttaki belirli yerlerde (yeni bir boşluk bölünmüş belirtecinin ilk karakteri olarak) tanınır.

Genişletildiğinde mutlak bir yolla değiştirilir.

$HOMEHOME, yalnızca kabuk tarafından ayarlanan bir değişken olduğundan ve değişken değiştirme için normal kabuk kurallarına uyduğundan işleri kullanmak (giriş boşluklara bölünmeden ve yürütülmeden önce gerçekleşir).


1

Haklısın. ~ / Downloads / home / username / Downloads ile aynıdır.

Bazı montajcılar ve aspiratörler bir şeyleri nereye koyması gerektiği konusunda çok seçicidir. Sanırım, filepatları günlüğe kaydettiği ve günlükler kabul edilen bir yoldan kabul etmeyeceği için olabilir.

Bunun yerine / home / kullaniciadi yazmaya alıştım. :)

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.