dirname
Komut en temel, basit kapalı dosya yolunu yukarı ayrıştırma olduğu $0
(script adı) değişken:
dirname "$0"
Ancak, matt b'nin işaret ettiği gibi , döndürülen yol komut dosyasının nasıl adlandırıldığına bağlı olarak farklıdır. pwd
bu sadece geçerli dizinin ne olduğunu, komut dosyasının hangi dizinde bulunduğunu söylemediğinden işi yapmaz. Ayrıca, bir komut dosyasına sembolik bir bağlantı yürütülürse, bağlantının bulunduğu yer, gerçek komut dosyası değil.
Bazıları readlink
komuttan bahsetti , ancak en basit haliyle şunları kullanabilirsiniz:
dirname "$(readlink -f "$0")"
readlink
komut dosyasının yolunu, dosya sisteminin kökünden mutlak bir yola çözümleyecektir. Böylece, tek veya çift nokta, tildes ve / veya sembolik bağlantılar içeren yollar tam bir yola çözülecektir.
İşte bunların her birini gösteren bir senaryo whatdir.sh
:
#!/bin/bash
echo "pwd: `pwd`"
echo "\$0: $0"
echo "basename: `basename $0`"
echo "dirname: `dirname $0`"
echo "dirname/readlink: $(dirname $(readlink -f $0))"
Göreli bir yol kullanarak bu komut dosyasını ev dizinimde çalıştırma:
>>>$ ./whatdir.sh
pwd: /Users/phatblat
$0: ./whatdir.sh
basename: whatdir.sh
dirname: .
dirname/readlink: /Users/phatblat
Yine de, betiğin tam yolunu kullanarak:
>>>$ /Users/phatblat/whatdir.sh
pwd: /Users/phatblat
$0: /Users/phatblat/whatdir.sh
basename: whatdir.sh
dirname: /Users/phatblat
dirname/readlink: /Users/phatblat
Şimdi dizinleri değiştirme:
>>>$ cd /tmp
>>>$ ~/whatdir.sh
pwd: /tmp
$0: /Users/phatblat/whatdir.sh
basename: whatdir.sh
dirname: /Users/phatblat
dirname/readlink: /Users/phatblat
Ve son olarak betiği çalıştırmak için sembolik bir bağlantı kullanarak:
>>>$ ln -s ~/whatdir.sh whatdirlink.sh
>>>$ ./whatdirlink.sh
pwd: /tmp
$0: ./whatdirlink.sh
basename: whatdirlink.sh
dirname: .
dirname/readlink: /Users/phatblat
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd && echo x)"
- ve komut değiştirme olmadan kaldırabilirsinizDIR="${DIR%x}"
.