Bash bir komut hangi dizin olduğunu'saklı s?
Nasıl ki Bash bir komut Bash script bulunduğu dizinin yolunu alabilirim?
Örneğin, diyelim ki, başka bir uygulama için bir başlatıcısı olarak bir Bash betiği kullanmak istiyorum diyelim. Bash komut dosyası bulunduğu bir çalışma dizinini değiştirmek istiyorum, o yüzden böyle dizin: dosyalar üzerinde çalışmak için
$ ./application
CEVAP
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
bir yararlı senaryonun tam dizin adı çağrılmak nerede olursa olsun verecek oyunu.
Bu kadar uzun yolu son bileşeni komut dosyası, bir sembolik bağ olup olmadığını bulmak için kullanılan dizin bağlantılar TAMAM) gibi çalışır. Ayrıca senaryoyu kendisi için herhangi bir bağlantıları çözmek istiyorsanız, çok satırlı bir çözüm gerekir:
SOURCE="${BASH_SOURCE[0]}"
while [ -h "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symlink
DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
SOURCE="$(readlink "$SOURCE")"
[[ $SOURCE != /* ]] && SOURCE="$DIR/$SOURCE" # if $SOURCE was a relative symlink, we need to resolve it relative to the path where the symlink file was located
done
DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
Bu son bir takma herhangi bir kombinasyonu ile, source
, bash -c
, sembolik, vb çalışır.
8 ** bu kod çalıştırmadan önce farklı bir dizine, sonuç yanlış olabilir! dikkat: Ayrıca, $CDPATH
gotchas dikkat et.
Nasıl çalıştığını anlamak için, daha ayrıntılı bu form çalıştırmayı deneyin:
#!/bin/bash
SOURCE="${BASH_SOURCE[0]}"
while [ -h "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symlink
TARGET="$(readlink "$SOURCE")"
if [[ $TARGET == /* ]]; then
echo "SOURCE '$SOURCE' is an absolute symlink to '$TARGET'"
SOURCE="$TARGET"
else
DIR="$( dirname "$SOURCE" )"
echo "SOURCE '$SOURCE' is a relative symlink to '$TARGET' (relative to '$DIR')"
SOURCE="$DIR/$TARGET" # if $SOURCE was a relative symlink, we need to resolve it relative to the path where the symlink file was located
fi
done
echo "SOURCE is '$SOURCE'"
RDIR="$( dirname "$SOURCE" )"
DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
if [ "$DIR" != "$RDIR" ]; then
echo "DIR '$RDIR' resolves to '$DIR'"
fi
echo "DIR is '$DIR'"
Ve böyle bir şey yazacaktır:
SOURCE './scriptdir.sh' is a relative symlink to 'sym2/scriptdir.sh' (relative to '.')
SOURCE is './sym2/scriptdir.sh'
DIR './sym2' resolves to '/home/ubuntu/dotfiles/fo fo/real/real1/real2'
DIR is '/home/ubuntu/dotfiles/fo fo/real/real1/real2'
Bash Komut dosyası geçerli bir dizin a...
Nasıl bir bash komut ile CPU bir başak...
Farklı bir dizin için komut NuGet...
Bash: çalıştırmadan önce her komut Yaz...
Nasıl eğer komut satırı araçları yüklü...