Mac OS X'te kabuk betiğindeki mutlak dosya adını nasıl alabilirim?


19

Şu anda yürütülen komut dosyasının mutlak dosya adını almak istiyorum. Bağlantılar da çözülmelidir.

Linux'ta bu şu şekilde yapılır:

$(readlink -mn "$0")

ancak Mac OS X'te çok farklı readlinkçalışıyor gibi görünüyor .

Bunun kullanılarak yapıldığını okudum

$(realpath $0)

BSD'de ama bu da işe yaramıyor. Mac OS X'de yoktur realpath.

Herhangi bir fikir?


1
SO ile ilgili bu soruya bakın: stackoverflow.com/questions/799679/…
Telemachus


Yanıtlar:


19

Hile ve bu çok şey için perl kullanın:

#!/bin/bash
dirname=`perl -e 'use Cwd "abs_path";print abs_path(shift)' $0`
echo $dirname

Senaryoyu sadece perl'e yazacağımı düşünürdüm ve çoğu zaman yazıyorum ama her zaman değil.


Bu işe yarıyor, çok teşekkürler. En kısa zamanda sana bir oy vereceğim. Herkes bunu yapmak için "saf kabuk" yolu var mı?
Huxi

1
Korkarım ki bu kadar iyi. (Google'da bulabileceğiniz çok satırlı "saf kabuk" hackleri göz önüne alındığında)
Arjan

başka bir olasılık (çirkin olsa da) '..' yolunu geçmek, '..' ile aynı dosyayı (yani: en üstte olursunuz) döndürene kadar ezberlemek (özyineleme veya dizi) gitmek için yol. Legato'nun Networker yedekleme yazılımını bir 'gerçek' yol (ama belki de mutlak değil) elde etme yöntemi olarak strace sırasında bunu gördüm. Ama yukarıdakilerden çok daha fazla kod olurdu.
ericslaw

Birinin kodu neden 0 yerine $ 1 kullanacak şekilde değiştirdiğinden emin değilim. 1 $ bash betiğinin ilk argümanı değil mi? Ben ilk argüman değil, yürütme bash betiğinin yolunu istedim.
ericslaw

27
#!/usr/bin/env bash
scriptDir="$(cd "$(dirname "$0")" && pwd -P)"

MacOSX'te de çalışır.
Alexar

1
Bu süper! Etrafta yüzen çok fazla karmaşık cevap var.
Jason S

3
Bu, yalnızca sembolik dizindeki dosyalar için çalışır, genel olarak sembolik dosyalar için geçerli değildir
Gerhard Burger

1
unset -v CDPATHCD'den önce de yararlıdır , çünkü CDPATH ayarlanmışsa cd istenmeyen çıkışlara neden olabilir.
İkili Phile

Dosyanın en az tek bir symlinking katmanı ile başa çıkmak için, readlink ile uyumlu bir şekilde de test edebilirsiniz ( scriptDir=$(unset -v CDPATH; cd "$(dirname "$(readlink "$BASH_SOURCE" || echo "$BASH_SOURCE)")" && pwd -P)
mac'lerde

0

Bu sembol bağlantılarının kombinasyonlarını işler ve dosyalar ve klasörler üzerinde çalışır:

#!/usr/bin/env bash
realpath()
{
    if ! pushd $1 &> /dev/null; then 
        pushd ${1##*/} &> /dev/null
        echo $( pwd -P )/${1%/*}
    else
        pwd -P
    fi
    popd > /dev/null
}

Ancak realpath'in - ilgili - özelliğini desteklemez. Bu , burada açıklanan dönüşümü gerektirir .


0

Başka bir yaklaşım:

# Install.
brew install coreutils

# Use the GNU variant.
grealpath --help
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.