realpath komutu bulunamadı


24

Debian’ı sıkıştırdım ve 64. Şu anki kabuğum bash. Aşağıdakileri terminalime yazarsam çalışır:

$ uname -a
Linux core 2.6.32-5-amd64 #1 SMP Fri May 10 08:43:19 UTC 2013 x86_64 GNU/Linux
$ echo $SHELL
/bin/bash                                                                                                                                                                                     
$ echo $(realpath test.sh)                                                                                                                                                     
/home/ffortier/test.sh

Test.sh dosyam şöyle görünüyor:

#!/bin/bash
echo $(realpath "$1")

Aşağıdakileri yürütmeye çalışırsam bir hata alıyorum

$ ./test.sh test.sh 
./test.sh: line 2: realpath: command not found

Realpath komutunu bir bash dosyasında nasıl kullanabilirim?

ek bilgi

$ type -a realpath
realpath is a function                                                                                                                                                                        
realpath ()                                                                                                                                                                                   
{                                                                                                                                                                                             
    f=$@;                                                                                                                                                                                     
    if [ -d "$f" ]; then                                                                                                                                                                      
        base="";                                                                                                                                                                              
        dir="$f";                                                                                                                                                                             
    else                                                                                                                                                                                      
        base="/$(basename "$f")";                                                                                                                                                             
        dir=$(dirname "$f");                                                                                                                                                                  
    fi;                                                                                                                                                                                       
    dir=$(cd "$dir" && /bin/pwd);                                                                                                                                                             
    echo "$dir$base"                                                                                                                                                                          
}           

Yanıtlar:


9

Realpath gerçek bir komut mu, script mi? Nereden geldiğini görmek isterim.

$ type -a realpath

Bu araca aşina değilim ve bu yüzden normal dağılımınızın bir parçası değil, belki de Bash’in üzerinde olmayan $PATHama giriş ortamınızın içinde bulunan standart olmayan bir yere kurulmuş $PATH.

Her durumda, yukarıdaki typekomut size komutun nereden geldiğini, hangi noktada komut dosyası içinde çağırdığınız yöntemi değiştirebileceğiniz gibi gösterir:

echo $(/path/to/realpath test.sh)

Veya betiğinizin $PATHstandart olmayan bu konumu da içerecek şekilde değiştirin .

Kabuktaki fonksiyonlar

Bir kabuk betiğini çağırdığınızda ortamınızın çoğu aranmaz. Bunu düşünürseniz, bu çok mantıklıdır, çünkü genellikle komut dosyalarının bir kullanıcı ortamının sahip olabileceği tüm ek bagajlara sahip olmasını istemezsiniz.

Hangi kaynak dosyanın bu işlevi sağladığını belirleyebilir ve onu kaynaklandırabilir veya Bash'e giriş ortamınızı birleştirmesini isteyebilirsiniz.

#!/bin/bash -l
echo $(realpath "$1")

Bu bir fonksiyon, bkz. Düzenleme
Francis

@Francis - evet senaryonuzu çağırdığınızda fonksiyonlar dahil değildir. Gelmelerini istiyorsanız, onları kaynaklamanız gerekecektir. Hangi dosyanın işlevi sağladığını bulun ve kaynak yapın. Eğer sadece bütün kıskanı istiyorsan. o zaman bash'a olan aramanı değiştir #!/bin/bash -l.
slm

Bu fonksiyonun nereden geldiğini nasıl bulabilirim?
Francis

1
@mikeserv - teşekkürler, bunu yazarken hala içermeyen Fedora 14 kullanıyordum realpath. Fedora 19 sistemim şimdi bu aracı içeriyor. Ayrıca OP'nin 2.6 çekirdeği olan bir Debian kullandığını ve bu nedenle realpathde yaşına göre sisteminin de kayıp olduğunu fark ettin .
slm

1
@mikeserv - evet şaşırdım, bu şimdi eski bir Q'su, ama hakkında bilgi commandhala benim için yararlı oldu. POSIX mermilerinde gösterdiklerimi yapmanın daha taşınabilir bir yolu.
slm

27

Adı verilen en az iki program var realpath:

  • GNU coreutils içermediğinde eski bir program readlink -f. Şimdi lehine itiraz edildi readlink -f, birçok dağıtım onu ​​taşımayı bıraktı.
  • realpathGNU'da tanıtılan programı 8.15 coreutils. Bu, Debian sıkışıklığı içinde olmak veya hatta harap olmak için çok eski; Yazarken, Debian kararsız da göndermez . Bu program çok yakın readlink -f.

Bazı nedenlerden dolayı, davranışını kısmen taklit eden bir kabuk işlevine sahipsiniz realpath. Bu öykünme kısmidir: sembolik bir linkten çağırırsanız, sembolik linke uymaz.

Bu, büyük olasılıkla veya içinden yüklenen bir kabuk işlevi olduğu için, .bashrcyalnızca etkileşimli kabuğunuzda çalışan kod için kullanılabilir. Linux'u çalıştırdığınızı varsayarak, diğer programların kullanımına açık olmasını istiyorsanız, öykünecek bir komut dosyası oluşturun realpath:

#!/bin/sh
readlink -f -- "$@"

(Bu realpathnadiren kullanılan komut satırı seçeneklerini taklit etmez .)


2
realpathProgramın coreutils tarafından onaylanmadığına ya da varsayılan olarak inşa edilmediğine dair coreutils git repo'da herhangi bir kanıt bulamıyorum . Yani Debian onu kaldırıyor olmalı.
Kaz

@Kaz Oh, peki, sadece işleri karmaşıklaştırmak için, coreutils yakın zamanda (8.15) realpathyakın fakat tam olarak aynı olmayan bir ikili dosya ortaya koydu readlink -f. Debian kararlı 8.13 taşıyor. Debian kararsız programı eski programlarını korumayı seçti .
Gilles 'SO- kötü olmayı bırak'

Değildi o geçenlerde - bu Oca 2012. oldu savannah.gnu.org/forum/forum.php?forum_id=7076
mikeserv

1
@mikeserv Söz konusu dağıtım için çok yakın (Debian squeeze). Mevcut Debian istikrarlı için bile çok yeni.
Gilles 'SO- kötü olmaktan'

Bu biraz korkutucu. Kaç yaşındalar openssl?
mikeserv

8

Komut dosyası farklı kapsamda olduğundan ve rc dosyalarınızda tanımlanan yerel işlevlerinize ve diğer adlarınıza erişmediğinden yalnızca kabukta çalışır . Ve realpathkomut aslında sisteminizde mevcut değil.

Bu yüzden ya realpathpaketten yükleyin , kendi fonksiyonunuzu tanımlayın (betiğin bir parçası olarak, bazı örnekleri kontrol edin ) veya rc dosyasını tanımlandığı yere (örneğin . ~/.bashrc) betiğinize yerleştirin .


realpathMevcut değilse kurmanız gereken adımlar :

  • Ubuntu: sudo apt-get install coreutils
  • OS X: brew install coreutils

Ubuntu ve Debian

Debian veya Ubuntu'da realpathvarsayılan olarak yüklenmesi gerektiği anlaşılmaktadır. Son Debian 8'i (Jessie) kontrol ettim ve coreutilsvarsayılan olarak yüklenmiş gibi görünüyor .

Yeni VM görüntüleri kullanılarak test edilmiştir:

$ vagrant init debian/jessie64 && vagrant up --provider virtualbox && vagrant ssh
$ vagrant init ubuntu/vivid64 && vagrant up --provider virtualbox && vagrant ssh

Sonra VM'de:

$ type -a realpath
realpath is /usr/bin/realpath

Bunun yerine, paket tarafından sağlanan (veya ) realpathda kullanabilirsiniz .readlink -f filegreadlinkcoreutils


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.