dirnameKomut 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. pwdbu 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ı readlinkkomuttan bahsetti , ancak en basit haliyle şunları kullanabilirsiniz:
dirname "$(readlink -f "$0")"
readlinkkomut 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}".