SORU
12 EYLÜL 2008, Cuma


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
29 EKİM 2008, ÇARŞAMBA


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'

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • EvilControllers

    EvilControll

    20 Ocak 2008
  • kidrauhl

    kidrauhl

    15 Ocak 2007
  • kimaliz

    kimaliz

    18 Temmuz 2006