2015-05-12 27 views
10

Bu bir kabuk komut dosyasıdır (.sh dosyası). Geçerli dizine göre mutlak bir yol oluşturmalıyım. pwd hakkında biliyorum, ancak başka bir dizeyle nasıl birleştirebilirim? içindekiler neredeGeçerli dizini alın ve bir yolu birleştirin

path="$(pwd)/some/path" 

$( bir altkabuk açtığında (ve ) kapatır):

"$pwd/some/path" 
+1

Kabuğunuz nedir? Bazı kabuklar '$ PWD' değişkenini korur, bu nedenle 'pwd' –

cevap

17

istediğiniz gibi sesler: İşte yapmak ne çalışıyorum bir örnektir Bir betik olarak yürütülür, böylece dizede bu konuma herhangi bir çıktı verilir.


sıklıkla çalıştığı senaryonun dizini oluyor Daha kullanışlı:

aynı yola giderir çünkü nerede komut dosyasını çalıştırdığınızda olursa olsun daha kullanışlı
dot="$(cd "$(dirname "$0")"; pwd)" 
path="$dot/some/path" 

:

> pwd 
~ 
> ./my_project/my_script.sh 
~/my_project/some/path 

ziyade:

> pwd 
~ 
> ./my_project/my_script.sh 
~/some/path 
> cd my_project 
> pwd 
~/my_project 
> ./my_script.sh 
~/my_project/some/path 

Daha karmaşık ama o zaman ayrıştırmak ve sembolik izlemeniz gerekir (örneğin homebrew aracılığıyla komut dosyalarını yüklerken yaygın) bir sembolik bağla aracılığıyla yürütülen edilmişse çalışan betik dizini gerekirse:

if [[ "$OSTYPE" == *darwin* ]]; then 
    READLINK_CMD='greadlink' 
else 
    READLINK_CMD='readlink' 
fi 

dot="$(cd "$(dirname "$([ -L "$0" ] && $READLINK_CMD -f "$0" || echo "$0")")"; pwd)" 

Çalışması için daha karmaşık ve daha fazla gereksinim (ör. gnu uyumlu bir readlink bağlantısına sahip olmak zorundayım, bu yüzden onu kullanmayacağımı düşünüyorum. Sadece emin olduğumda, homebrew ile bir komut yüklemek gibi. tüm POSIX uyumlu kabukları mutlak bir yol olarak geçerli dizini içeren özel $PWD kabuk değişkeni tanımlamak için bir komut yerine pwd ($(...)) yerleşik kabuk kullanarak

+0

' '(' 'pwd' ')' i çağırmak zorunda kalmazsınız, '$ (pwd)' çalışır, '$ PWD' kullanmak daha basittir (ve marjinal olarak daha verimli). POSIX tarafından yetkilendirilmiş kabuk değişkeni. İyi ipucu _running betiğinin_dizinini belirliyor, ancak betiğin _symlink_ yoluyla çağrılması durumunda bunun beklenildiği gibi çalışmayacağını unutmayın. Ne yazık ki, aynı zamanda taşınabilir olan basit bir çözüm yoktur. – mklement0

+1

Doğru gerçek, sembolik bağlantılar daha karmaşık hale getirebilir, bunu göstermek için güncelleyeceğim. –

+0

Güncelleme için teşekkürler. 'Readlink -f' argümanı _not_ bir sembolik bağlantı olduğunda bile mutlak hedef yolunu rapor ettiğinden, 'dot = $ (dirname - "$ (READLINK_CMD -f -" $ 0 ")") '' e basitleştirebilirsiniz. '$ OSTYPE' kullanımı taşınabilir değil (' bash' ve 'zsh' var, ancak) unutmayın. POSIX uyumlu bir kabuk işlevi oluşturdum [burada] (http://stackoverflow.com/a/29835459/45375). – mklement0

0
wd=`pwd` 
new_path="$wd/some/path" 
3

mandated by POSIX olarak, gerekli olan bir seçenektir, ancak . Böylece

, hem daha basit hem $(pwd) daha verimlidir $PWD kullanılarak: Eğer dizin yolundaki symlinks çözmek istiyorsa Ancak

"$PWD/some/path" # alternatively, for visual clarity: "${PWD}/some/path" 

, sizinle, pwd ihtiyaç DO onun -P seçenek:

"$(pwd -P)/some/path" 

Not: POSIX mandates that $PWD contain an absolute pathname with symlinks resolved. Bununla birlikte, pratikte NO büyük POSIX benzeri bir kabuk (bash, dash, ksh, zsh), bunların hepsi - sembolik link bileşenlerini muhafaza ederler. Böylece, bunları çözmek için pwd -P gereklidir.yaygın olduğunu üzerinden


Michael Allen's helpful answer puan çalışan komut nerede bulunduğunu dizini bilmek isterler.

meydan komut dosyası kendisi kökenli gerçek dizini belirleyen bir sembolik yüzden olabileceğidir taşınabilirliği bir zorunluluktur, özellikle önemsiz olmayan olduğunu.
This answer (benimki) bir çözüm gösterir. "dirname $0" ile

0

"Geçerli çalışma sciptine kadar dinamik yol alabilirsiniz. örneğin: dosyanızın kabuk klasörüne yerleştirilmiş dosya adı xyz'dir ve xyz dosyasına eklenecek anthor dosyası abc vardır. öylesine xyz dosyasını yerleştiriniz:

 php "`dirname $0`"/abc.php