Bir Bash beti─činin kaynak dizinini beti─čin i├žinden al─▒n


Al─▒nan cevaba git


Bash beti─činin bulundu─ču dizinin yolunu o beti─čin i├žinde nas─▒l bulurum?

├ľrne─čin, ba┼čka bir uygulama i├žin ba┼člat─▒c─▒ olarak bir Bash komut dosyas─▒ kullanmak istedi─čimi varsayal─▒m. ├çal─▒┼čma dizinini Bash beti─činin bulundu─ču dizine de─či┼čtirmek istiyorum, b├Âylece ┼ču dizindeki dosyalar─▒ ├žal─▒┼čt─▒rabilirim, ┼č├Âyle:

$ ./application

4615









Cevap say─▒s─▒n─▒ say: 30






 #!/bin/bash

DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
 

Nereden ├ža─čr─▒ld─▒─č─▒na bak─▒lmaks─▒z─▒n size komut dosyas─▒n─▒n tam dizin ad─▒n─▒ verecek kullan─▒┼čl─▒ bir astard─▒r.

Komut dosyas─▒n─▒ bulmak i├žin kullan─▒lan yolun son bile┼čeni bir sembolik ba─člant─▒ olmad─▒─č─▒ s├╝rece ├žal─▒┼č─▒r (dizin ba─člant─▒lar─▒ TAMAM). Ayr─▒ca beti─če giden ba─člant─▒lar─▒ da ├ž├Âzmek istiyorsan─▒z, ├žok sat─▒rl─▒ bir ├ž├Âz├╝me ihtiyac─▒n─▒z var:

 #!/bin/bash

SOURCE="${BASH_SOURCE[0]}"
while [ -h "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symlink
  DIR="$( cd -P "$( dirname "$SOURCE" )" >/dev/null 2>&1 && 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" )" >/dev/null 2>&1 && pwd )"
 

Bu sonuncusu takma adlar─▒, herhangi bir kombinasyonu ile ├žal─▒┼čacakt─▒r source , bash -c , sembolik ba─člar, vb

Dikkat: cd Bu pasaj─▒ ├žal─▒┼čt─▒rmadan ├Ânce farkl─▒ bir dizine giderseniz , sonu├ž yanl─▒┼č olabilir!

Ayr─▒ca, ├ž─▒kt─▒y─▒ $CDPATH stderr'e y├Ânlendirmek i├žin cd ak─▒ll─▒ olarak ge├žersiz k─▒l─▒nm─▒┼čsa ( update_terminal_cwd >&2 Mac'te arama yaparken oldu─ču gibi ka├ž─▒┼č dizileri de dahil olmak ├╝zere), kullan─▒c─▒ ├ž─▒kt─▒lar─▒ ve stderr ├ž─▒k─▒┼č yan etkilerine dikkat edin . Komutunuzun >/dev/null 2>&1 sonuna ekleme , cd her iki olas─▒l─▒kla da ilgilenecektir.

Nas─▒l ├žal─▒┼čt─▒─č─▒n─▒ anlamak i├žin bu daha ayr─▒nt─▒l─▒ formu ├ž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" )" >/dev/null 2>&1 && pwd )"
if [ "$DIR" != "$RDIR" ]; then
  echo "DIR '$RDIR' resolves to '$DIR'"
fi
echo "DIR is '$DIR'"
 

Ve ┼č├Âyle bir ┼čey yazd─▒racak:

 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'
 

6116







Kullan─▒m dirname "$0" :

 #!/bin/bash
echo "The script you are running has basename `basename "$0"`, dirname `dirname "$0"`"
echo "The present working directory is `pwd`"
 

pwd E─čer beti─či i├žinde bulundu─ču dizinden ├žal─▒┼čt─▒rm─▒yorsan─▒z, yaln─▒z kullanmak i┼če yaramayacakt─▒r.

 [[email protected] ~]$ pwd
/home/matt
[[email protected] ~]$ ./test2.sh
The script you are running has basename test2.sh, dirname .
The present working directory is /home/matt
[[email protected] ~]$ cd /tmp
[[email protected] tmp]$ ~/test2.sh
The script you are running has basename test2.sh, dirname /home/matt
The present working directory is /tmp
 

812







Dirname komutu en basit olan─▒d─▒r, sadece $ 0 (script name) de─či┼čkeninin dosya ad─▒na giden yolu ayr─▒┼čt─▒r─▒r:

 dirname "$0"
 

Ancak, Matt B'nin i┼čaret etti─či gibi , geri g├Ânderilen yol, beti─čin nas─▒l adland─▒r─▒ld─▒─č─▒na ba─čl─▒ olarak de─či┼čir. pwd i┼či yapmaz, ├ž├╝nk├╝ bu sadece mevcut dizinin ne oldu─čunu, beti─čin hangi dizinde bulundu─čunu g├Âsterir. ba─člant─▒n─▒n bulundu─ču yere, as─▒l komut dosyas─▒n─▒ de─čil.

Baz─▒lar─▒ readlink komutundan bahsetti , ancak en basitinde kullanabilirsiniz:

 dirname "$(readlink -f "$0")"
 

readlink, komut dosyas─▒ yolunu dosya sisteminin k├Âk├╝nden gelen mutlak bir yola ├ž├Âzecektir. Bu nedenle, tek veya ├žift nokta, tilde ve / veya sembolik ba─č i├žeren yollar tam yola ├ž├Âz├╝lecektir.

─░┼čte bunlar─▒n her birini g├Âsteren bir betik, 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))"
 

Bu beti─či kendi dizinimde ├žal─▒┼čt─▒rarak g├Âreceli bir yol kullanarak:

 >>>$ ./whatdir.sh 
pwd: /Users/phatblat
$0: ./whatdir.sh
basename: whatdir.sh
dirname: .
dirname/readlink: /Users/phatblat
 

Yine, ancak komut dosyas─▒n─▒n 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┼čtiriyor:

 >>>$ cd /tmp
>>>$ ~/whatdir.sh 
pwd: /tmp
$0: /Users/phatblat/whatdir.sh
basename: whatdir.sh
dirname: /Users/phatblat
dirname/readlink: /Users/phatblat
 

Ve sonunda 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
 

455







 pushd . > /dev/null
SCRIPT_PATH="${BASH_SOURCE[0]}"
if ([ -h "${SCRIPT_PATH}" ]); then
  while([ -h "${SCRIPT_PATH}" ]); do cd `dirname "$SCRIPT_PATH"`; 
  SCRIPT_PATH=`readlink "${SCRIPT_PATH}"`; done
fi
cd `dirname ${SCRIPT_PATH}` > /dev/null
SCRIPT_PATH=`pwd`;
popd  > /dev/null
 

Dahil olmak ├╝zere t├╝m s├╝r├╝mleri i├žin ├žal─▒┼č─▒r

  • ├çok derinlikli yumu┼čak ba─člant─▒ ├╝zerinden arand─▒─č─▒nda
  • dosya ne zaman
  • komut dosyas─▒ " source " aka . (dot) operat├Âr├╝ komutuyla ├ža─čr─▒ld─▒─č─▒nda .
  • arg arayandan $0 de─či┼čtirildi─činde.
  • "./script"
  • "/full/path/to/script"
  • "/some/path/../../another/path/script"
  • "./some/folder/script"

Alternatif olarak, bash komut kendisi ise g├Âreceli sembolik link size istedi─činiz tam yolunu takip ve d├Ân├╝┼č ba─člant─▒l─▒-komut dosyas─▒:

 pushd . > /dev/null
SCRIPT_PATH="${BASH_SOURCE[0]}";
if ([ -h "${SCRIPT_PATH}" ]) then
  while([ -h "${SCRIPT_PATH}" ]) do cd `dirname "$SCRIPT_PATH"`; SCRIPT_PATH=`readlink "${SCRIPT_PATH}"`; done
fi
cd `dirname ${SCRIPT_PATH}` > /dev/null
SCRIPT_PATH=`pwd`;
popd  > /dev/null
 

SCRIPT_PATH tam olarak verilir, nas─▒l adland─▒r─▒ld─▒─č─▒na bak─▒lmaks─▒z─▒n.
Sadece beti─čin ba┼č─▒nda bunu buldu─čunuzdan emin olun.

Bu yorum ve kod Copyleft, GPL2.0 veya ├╝st├╝ ya da CC-SA 3.0 (CreativeCommons Share Alike) veya sonraki s├╝r├╝mleri alt─▒nda se├žilebilir lisans. (c) 2008. T├╝m haklar─▒ sakl─▒d─▒r. Hi├žbir garanti yok. Uyar─▒ld─▒n.
http://www.gnu.org/licenses/gpl-2.0.txt
http://creativecommons.org/licenses/by-sa/3.0/
18eedfe1c99df68dc94d4a94712a71aaa8e1e9e36cacf421b9463dd2bbaa02906d6d66566366ac6421b9463dd2bbaa02906d6d6d665666566656656d6d6656656d6d6656306d6d6656d6d6656d6d6d6_6_6u6/6w.gnu.org/licenses/gpl-2.0.txt


179







K─▒sa cevap:

 `dirname $0`
 

veya ( tercihen ):

 $(dirname "$0")
 

105







$ BASH_SOURCE kullanabilirsiniz

 #!/bin/bash

scriptdir=`dirname "$BASH_SOURCE"`
 

Bir bash uzant─▒s─▒ndan bu yana #! / Bin / bash kullanman─▒z ve #! / Bin / sh kullanmaman─▒z gerekti─čini unutmay─▒n


98







Bu yapmal─▒:

 DIR=$(dirname "$(readlink -f "$0")")
 

Yoldaki sembolik ve bo┼čluklarla ├žal─▒┼č─▒r. Dirname ve readlink i├žin man sayfalar─▒na bak─▒n─▒z .

D├╝zenle:

Yorum par├žas─▒ndan Mac OS ile ├žal─▒┼čm─▒yor gibi g├Âr├╝n├╝yor. Bunun neden oldu─ču hakk─▒nda hi├žbir fikrim yok. Baska ├Âneri?


67







pwd Ge├žerli ├žal─▒┼čma dizini bulmak i├žin, ve kullan─▒labilecek dirname belirli bir dosyan─▒n dizini bulmak i├žin (├žal─▒┼čt─▒r─▒ld─▒ komut vard─▒r $0 , bu y├╝zden dirname $0 akt├╝el script dizini vermelidir).

Ancak, dirname tam olarak mevcut ├žal─▒┼čma dizinine g├Âre olmayaca─č─▒ndan daha muhtemel olan dosya ad─▒n─▒n dizin k─▒sm─▒n─▒ verir. Komut dosyan─▒z─▒n bir nedenden ├Ât├╝r├╝ dizini de─či┼čtirmesi gerekiyorsa, ├ž─▒kt─▒s─▒ dirname anlams─▒z hale gelir.

A┼ča─č─▒dakileri ├Âneriyorum:

 #!/bin/bash

reldir=`dirname $0`
cd $reldir
directory=`pwd`

echo "Directory is $directory"
 

Bu ┼čekilde, g├Âreceli bir dizin yerine mutlak bir sonu├ž elde edersiniz.

Komut dosyas─▒ ayr─▒ bir bash ├Ârne─činde ├žal─▒┼čt─▒r─▒laca─č─▒ndan, ├žal─▒┼čma dizinini sonradan geri y├╝klemeye gerek yoktur, ancak beti─činizde baz─▒ nedenlerden dolay─▒ de─či┼čiklik yapmak istiyorsan─▒z, pwd ├Ânce sizden bir de─či┼čkene kolayca de─čer atayabilirsiniz. ileride kullanmak ├╝zere dizini de─či┼čtirin.

Sadece

 cd `dirname $0`
 

sorudaki belirli senaryoyu ├ž├Âzer, daha genel olarak daha kullan─▒┼čl─▒ bir yol bulurum.


60







Bunun di─čerlerinin yapt─▒─č─▒ kadar kolay oldu─čunu sanm─▒yorum. pwd ├žal─▒┼čm─▒yor, ├ž├╝nk├╝ ge├žerli dir, mutlaka beti─čin bulundu─ču klas├Âr de─čildir. $ 0 da her zaman bilgiye sahip de─čildir. Bir komut dosyas─▒n─▒ ├ža─č─▒rmak i├žin a┼ča─č─▒daki ├╝├ž yolu g├Âz ├Ân├╝nde bulundurun.

 ./script

/usr/bin/script

script
 

Birinci ve ├╝├ž├╝nc├╝ yollarda $ 0 tam yol bilgisine sahip de─čildir. ─░kinci ve ├╝├ž├╝nc├╝ s─▒rada, pwd ├žal─▒┼čm─▒yor. Dir'i ├╝├ž├╝nc├╝ yolla elde etmenin tek yolu yolun i├žinden ge├žmek ve dosyay─▒ do─čru e┼čle┼čmeyle bulmakt─▒r. Temel olarak, kodun i┼čletim sisteminin ne yapt─▒─č─▒n─▒ yinelemesi gerekir.

─░stedi─činiz ┼čeyi yapman─▒n bir yolu, yaln─▒zca / usr / share dizinindeki verileri kodlamak ve tam yoldan ba┼čvuru yapmakt─▒r. Veriler yine de / usr / bin dizininde olmamal─▒d─▒r, bu y├╝zden muhtemelen yap─▒lmas─▒ gereken budur.


36







 SCRIPT_DIR=$( cd ${0%/*} && pwd -P )
 

33







Kabul edilen cevapta bir astar─▒ kopyalay─▒p yap─▒┼čt─▒rmak i├žin bu sayfaya tekrar tekrar gelmekten b─▒kt─▒m. Bununla ilgili sorun anlamak ve hat─▒rlamak kolay de─čil.

─░┼čte hat─▒rlamas─▒ kolay bir senaryo:

 DIR=$(dirname "${BASH_SOURCE[0]}")  # get the directory name
DIR=$(realpath "${DIR}")    # resolve its full path if need be
 

32







Bu Mac OS X 10.6.6'daki ge├žerli ├žal─▒┼čma dizinini al─▒r:

 DIR=$(cd "$(dirname "$0")"; pwd)
 

30







 $(dirname "$(readlink -f "$BASH_SOURCE")")
 

30







Bu Linux'a ├Âzg├╝d├╝r, ancak ┼čunlar─▒ kullanabilirsiniz:

 SELF=$(readlink /proc/$$/fd/255)
 

27







─░┼čte POSIX uyumlu bir astar:

 SCRIPT_PATH=`dirname "$0"`; SCRIPT_PATH=`eval "cd \"$SCRIPT_PATH\" && pwd"`

# test
echo $SCRIPT_PATH
 

22







Bunlar─▒n her birini denedim ve hi├žbiri i┼če yaramad─▒. Biri ├žok yak─▒nd─▒ ama ├žok k├Ât├╝ bir ┼čekilde k─▒r─▒lan k├╝├ž├╝k bir b├Âcek vard─▒; yolu t─▒rnak i┼čaretleri i├žine almay─▒ unuttular.

Ayr─▒ca bir├žok ki┼či beti─či bir kabuktan ├žal─▒┼čt─▒rd─▒─č─▒n─▒z─▒ varsay─▒yor, bu nedenle yeni bir komut dosyas─▒ a├žt─▒─č─▒n─▒zda evinizin varsay─▒lan oldu─čunu unutmay─▒n.

Bu dizini boyut i├žin deneyin:

/ var / Hi├ž kimse / D├╝┼č├╝nce / Uzay Hakk─▒nda Olmak / Dizin ─░├žinde / ─░sim / Ve ─░┼čte file.text

Bu, onu nas─▒l ve nerede ├žal─▒┼čt─▒rd─▒─č─▒n─▒zdan ba─č─▒ms─▒z olarak do─čru olur.

 #!/bin/bash
echo "pwd: `pwd`"
echo "\$0: $0"
echo "basename: `basename "$0"`"
echo "dirname: `dirname "$0"`"
 

Bu y├╝zden ger├žekten yararl─▒ hale getirmek i├žin burada ├žal─▒┼čan beti─čin dizine nas─▒l de─či┼čtirilece─či:

 cd "`dirname "$0"`"
 

umar─▒m yard─▒mc─▒ olur


17







─░┼čte basit, do─čru yol:

 actual_path=$(readlink -f "${BASH_SOURCE[0]}")
script_dir=$(dirname "$actual_path")
 

A├ž─▒klama:

  • ${BASH_SOURCE[0]} - komut dosyas─▒n─▒n tam yolu. Bunun de─čeri, komut dosyas─▒ kaynakland─▒─č─▒ zaman bile do─čru olacakt─▒r, ├Ârne─čin bash source <(echo 'echo $0') yazd─▒r─▒rken , bunun yerine kodun ${BASH_SOURCE[0]} tam yolunu yazd─▒racakt─▒r. (Elbette bu, Bash'e ba─č─▒ml─▒ oldu─čunuzdan emin oldu─čunuzu varsayar.)

  • readlink -f - Belirtilen yoldaki sembolik ba─člant─▒lar─▒ tekrar tekrar ├ž├Âzer. Bu bir GNU uzant─▒s─▒d─▒r ve (├Ârne─čin) BSD sistemlerinde mevcut de─čildir. Mac kullan─▒yorsan─▒z, GNU'yu kurmak coreutils ve buna destek sa─člamak i├žin Homebrew kullanabilirsiniz greadlink -f .

  • Ve elbette dirname yolun ana dizinini al─▒r.


17







B├Âyle bir ┼čey kullan─▒rd─▒m:

 # retrieve the full pathname of the called script
scriptPath=$(which $0)

# check whether the path is a link or not
if [ -L $scriptPath ]; then

    # it is a link then retrieve the target path and get the directory name
    sourceDir=$(dirname $(readlink -f $scriptPath))

else

    # otherwise just get the directory name of the script path
    sourceDir=$(dirname $scriptPath)

fi
 

15







├ç├Âzelti E-satis ve 3bcdnlklvc04a i├žin hafif bir revizyon i┼čaret verdikleri yan─▒ta

 SCRIPT_DIR=''
pushd "$(dirname "$(readlink -f "$BASH_SOURCE")")" > /dev/null && {
    SCRIPT_DIR="$PWD"
    popd > /dev/null
}    
 

Bu hala listeledikleri t├╝m durumlarda ├žal─▒┼čmal─▒d─▒r.

D├ťZENLEME: konsolebox sayesinde ba┼čar─▒s─▒z itme sonra popd ├Ânlemek


14







 #!/bin/sh
PRG="$0"

# need this for relative symlinks
while [ -h "$PRG" ] ; do
   PRG=`readlink "$PRG"`
done

scriptdir=`dirname "$PRG"`
 

13







$ _ , 0 $ 'a alternatif olarak belirtilmeye de─čer. Bash'tan bir komut dosyas─▒ ├žal─▒┼čt─▒r─▒yorsan─▒z, kabul edilen cevap ┼ču ┼čekilde k─▒salt─▒labilir:

 DIR="$( dirname "$_" )"
 

Bunun beti─činizdeki ilk ifade olmas─▒ gerekti─čini unutmay─▒n.


11







Verilen cevaplar─▒n ├žo─čunu kar┼č─▒la┼čt─▒rd─▒m ve daha kompakt ├ž├Âz├╝mler buldum. Bunlar, favori kombinasyonunuzdan ├ž─▒kan ├ž─▒lg─▒n kenar durumlar─▒n─▒n hepsini ele al─▒yor gibi g├Âr├╝n├╝yor:

  • Mutlak yollar veya g├Âreceli yollar
  • Dosya ve dizin yaz─▒l─▒m ba─člant─▒lar─▒
  • ├ça─č─▒rma olarak script , bash script , bash -c script , source script , ya da . script
  • Dizinlerdeki ve / veya dosya ad─▒ndaki bo┼čluklar, sekmeler, yeni sat─▒rlar, unicode vb.
  • Tire ile ba┼člayan dosya adlar─▒

Linux'tan ko┼čuyorsan─▒z, proc tan─▒t─▒c─▒y─▒ kullanmak ┼ču anda ├žal─▒┼čan komut dosyas─▒n─▒n tamamen ├ž├Âz├╝lm├╝┼č kayna─č─▒n─▒ bulmak i├žin en iyi ├ž├Âz├╝m gibi g├Âr├╝n├╝yor (etkile┼čimli bir oturumda, ba─člant─▒ ilgili olan─▒ i┼čaret eder /dev/pts/X ):

 resolved="$(readlink /proc/$$/fd/255 && echo X)" && resolved="${resolved%$'\nX'}"
 

Bunun i├žin k├╝├ž├╝k bir ├žirkinlik var, ancak d├╝zeltme kompakt ve anla┼č─▒lmas─▒ kolayd─▒r. Sadece bash ilkellerini kullanm─▒yoruz, ama ben bunun i├žin iyiyim, ├ž├╝nk├╝ readlink g├Ârevi olduk├ža kolayla┼čt─▒r─▒yor. echo X Bir ekleyen X dosya herhangi izleyen bo┼čluk yemi┼č almaz ve parametre ikamesi b├Âylece de─či┼čken dizesinin sonuna ${VAR%X} sat─▒r─▒n sonunda kurtulur X . ├ç├╝nk├╝ readlink (normalde de─čilse ├Ânceki oyununa gelen komut yerine yemi┼č olurdu) kendine ait bir yeni sat─▒r ekler, biz de o kurtulmak zorunday─▒z. Bu, en kolay ┼čekilde, yeni sat─▒rlar─▒ temsil etmek $'' gibi ka├ž─▒┼č dizilerini kullanmam─▒z─▒ sa─člayan al─▒nt─▒ ┼čemas─▒n─▒ kullanarak ger├žekle┼čtirilir \n (bu, ayn─▒ zamanda, kolayca adland─▒r─▒lm─▒┼č dizinleri ve dosyalar─▒ da kolayca yapabilirsiniz).

Yukar─▒dakiler, Linux ├╝zerinde ├žal─▒┼čmakta olan beti─či bulmak i├žin ihtiya├žlar─▒n─▒z─▒ kar┼č─▒lamal─▒d─▒r, ancak proc dosya sisteminiz elinizde de─čilse veya ba┼čka bir dosyan─▒n tam olarak ├ž├Âz├╝lm├╝┼č yolunu bulmaya ├žal─▒┼č─▒yorsan─▒z, belki a┼ča─č─▒daki kodu yararl─▒ bulabilirsiniz. Yukar─▒daki tek astardan sadece hafif bir de─či┼čiklik. E─čer garip bir dizin / dosya isimleriyle oynuyorsan─▒z, ├ž─▒kt─▒y─▒ ikisiyle de kontrol edin ls ve "basitle┼čtirilmi┼č" yollar ├ž─▒kartacak readlink ┼čekilde bilgilendirici, yeni sat─▒rlar gibi ┼čeylerin ls yerini alacak ? .

 absolute_path=$(readlink -e -- "${BASH_SOURCE[0]}" && echo x) && absolute_path=${absolute_path%?x}
dir=$(dirname -- "$absolute_path" && echo x) && dir=${dir%?x}
file=$(basename -- "$absolute_path" && echo x) && file=${file%?x}

ls -l -- "$dir/$file"
printf '$absolute_path: "%s"\n' "$absolute_path"
 

11







GNU coreutils okuma ba─člant─▒s─▒na sahip sistemler i├žin (├Ârn. Linux):

 $(readlink -f "$(dirname "$0")")
 

Gerek kullanmaya BASH_SOURCE ne zaman $0 komut dosyas─▒ dosya ad─▒n─▒ i├žerir.


10







Bunu yapman─▒n en k─▒sa ve en ┼č─▒k yolu:

 #!/bin/bash
DIRECTORY=$(cd `dirname $0` && pwd)
echo $DIRECTORY
 

Bu, t├╝m platformlarda i┼če yarayacak ve s├╝per temiz.

Daha fazla ayr─▒nt─▒ burada bulunabilir: https://www.electrictoolbox.com/bash-script-directory/


10







Kullanmay─▒ deneyin:

 real=$(realpath $(dirname $0))
 

9







Yani ... San─▒r─▒m bunu ald─▒m. Partiye ge├ž kald─▒klar─▒n─▒ d├╝┼č├╝n├╝yorum, ancak baz─▒lar─▒n─▒n bunun burada bulundu─čunu takdir edeceklerini d├╝┼č├╝n├╝yorum. Yorumlar a├ž─▒klamal─▒d─▒r.

 #!/bin/sh # dash bash ksh # !zsh (issues). G. Nixon, 12/2013. Public domain.

## 'linkread' or 'fullpath' or (you choose) is a little tool to recursively
## dereference symbolic links (ala 'readlink') until the originating file
## is found. This is effectively the same function provided in stdlib.h as
## 'realpath' and on the command line in GNU 'readlink -f'.

## Neither of these tools, however, are particularly accessible on the many
## systems that do not have the GNU implementation of readlink, nor ship
## with a system compiler (not to mention the requisite knowledge of C).

## This script is written with portability and (to the extent possible, speed)
## in mind, hence the use of printf for echo and case statements where they
## can be substituded for test, though I've had to scale back a bit on that.

## It is (to the best of my knowledge) written in standard POSIX shell, and
## has been tested with bash-as-bin-sh, dash, and ksh93. zsh seems to have
## issues with it, though I'm not sure why; so probably best to avoid for now.

## Particularly useful (in fact, the reason I wrote this) is the fact that
## it can be used within a shell script to find the path of the script itself.
## (I am sure the shell knows this already; but most likely for the sake of
## security it is not made readily available. The implementation of "$0"
## specificies that the $0 must be the location of **last** symbolic link in
## a chain, or wherever it resides in the path.) This can be used for some
## ...interesting things, like self-duplicating and self-modifiying scripts.

## Currently supported are three errors: whether the file specified exists
## (ala ENOENT), whether its target exists/is accessible; and the special
## case of when a sybolic link references itself "foo -> foo": a common error
## for beginners, since 'ln' does not produce an error if the order of link
## and target are reversed on the command line. (See POSIX signal ELOOP.)

## It would probably be rather simple to write to use this as a basis for
## a pure shell implementation of the 'symlinks' util included with Linux.

## As an aside, the amount of code below **completely** belies the amount
## effort it took to get this right -- but I guess that's coding for you.

##===-------------------------------------------------------------------===##

for argv; do :; done # Last parameter on command line, for options parsing.

## Error messages. Use functions so that we can sub in when the error occurs.

recurses(){ printf "Self-referential:\n\t$argv ->\n\t$argv\n" ;}
dangling(){ printf "Broken symlink:\n\t$argv ->\n\t"$(readlink "$argv")"\n" ;}
errnoent(){ printf "No such file: "[email protected]"\n" ;} # Borrow a horrible signal name.

# Probably best not to install as 'pathfull', if you can avoid it.

pathfull(){ cd "$(dirname "[email protected]")"; link="$(readlink "$(basename "[email protected]")")"

## 'test and 'ls' report different status for bad symlinks, so we use this.

 if [ ! -e "[email protected]" ]; then if $(ls -d "[email protected]" 2>/dev/null) 2>/dev/null;  then
    errnoent 1>&2; exit 1; elif [ ! -e "[email protected]" -a "$link" = "[email protected]" ];   then
    recurses 1>&2; exit 1; elif [ ! -e "[email protected]" ] && [ ! -z "$link" ]; then
    dangling 1>&2; exit 1; fi
 fi

## Not a link, but there might be one in the path, so 'cd' and 'pwd'.

 if [ -z "$link" ]; then if [ "$(dirname "[email protected]" | cut -c1)" = '/' ]; then
   printf "[email protected]\n"; exit 0; else printf "$(pwd)/$(basename "[email protected]")\n"; fi; exit 0
 fi

## Walk the symlinks back to the origin. Calls itself recursivly as needed.

 while [ "$link" ]; do
   cd "$(dirname "$link")"; newlink="$(readlink "$(basename "$link")")"
   case "$newlink" in
    "$link") dangling 1>&2 && exit 1                                       ;;
         '') printf "$(pwd)/$(basename "$link")\n"; exit 0                 ;;
          *) link="$newlink" && pathfull "$link"                           ;;
   esac
 done
 printf "$(pwd)/$(basename "$newlink")\n"
}

## Demo. Install somewhere deep in the filesystem, then symlink somewhere 
## else, symlink again (maybe with a different name) elsewhere, and link
## back into the directory you started in (or something.) The absolute path
## of the script will always be reported in the usage, along with "$0".

if [ -z "$argv" ]; then scriptname="$(pathfull "$0")"

# Yay ANSI l33t codes! Fancy.
 printf "\n\033[3mfrom/as: \033[4m$0\033[0m\n\n\033[1mUSAGE:\033[0m   "
 printf "\033[4m$scriptname\033[24m [ link | file | dir ]\n\n         "
 printf "Recursive readlink for the authoritative file, symlink after "
 printf "symlink.\n\n\n         \033[4m$scriptname\033[24m\n\n        "
 printf " From within an invocation of a script, locate the script's "
 printf "own file\n         (no matter where it has been linked or "
 printf "from where it is being called).\n\n"

else pathfull "[email protected]"
fi
 

8







A┼ča─č─▒daki ├žapraz uyumlu ├ž├Âz├╝m├╝ deneyin:

 CWD="$(cd -P -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd -P)"
 

(i┼čletim sistemine ba─čl─▒ olarak) gibi realpath veya readlink kullan─▒lamayan komutlar .

Not: Bash'de kullanmak ${BASH_SOURCE[0]} yerine Bash ├Ânerilir $0 , aksi takdirde dosya ( source / . ) kaynaklan─▒rken yol bozulabilir .

Alternatif olarak, a┼ča─č─▒daki i┼člevi bash'de deneyebilirsiniz:

 realpath () {
  [[ $1 = /* ]] && echo "$1" || echo "$PWD/${1#./}"
}
 

Bu fonksiyon 1 arg├╝man al─▒r. Arg├╝man zaten mutlak bir yoldaysa, oldu─ču gibi yazd─▒r─▒n, aksi takdirde $PWD de─či┼čken + dosya ad─▒ arg├╝man─▒n─▒ ( ./ ├Ânek olmadan ) yazd─▒r─▒n .

─░lgili:


8







Bu bash-3.2'de ├žal─▒┼č─▒r:

 path="$( dirname "$( which "$0" )" )"
 

─░┼čte kullan─▒m─▒na bir ├Ârnek:

Diyelim ki $ PATH dizininizde bir ~ / bin dizini var . Bu dizinde A komut dosyas─▒ var . Bu kayna─č─▒n s komut ~ / bin / lib / B . Eklenen komut dosyas─▒n─▒n orijinaliyle (alt dizin lib ) g├Âreli oldu─čunu ancak kullan─▒c─▒n─▒n ge├žerli dizine g├Âre oldu─čunu bilmiyorsunuz.

Bu, a┼ča─č─▒dakilerle ├ž├Âz├╝l├╝r ( A i├žinde ):

 source "$( dirname "$( which "$0" )" )/lib/B"
 

Kullan─▒c─▒n─▒n nerede oldu─ču veya beti─či nas─▒l ├ža─č─▒rd─▒─č─▒ ├Ânemli de─čildir, bu her zaman i┼če yarar.


7







Hmm, e─čer yoldaki ad ve dirname sadece onu kesmeyecek ve patikadan y├╝r├╝mek zor olacaksa (e─čer ebeveyn PATH vermediyse!). Bununla birlikte, kabu─čun komut dosyas─▒na a├ž─▒k bir tan─▒t─▒c─▒ya sahip olmas─▒ gerekir ve bash'de tan─▒t─▒c─▒ # 255'tir.

 SELF=`readlink /proc/$$/fd/255`
 

benim i├žin ├žal─▒┼č─▒yor.


7







Bir├žok cevab─▒ ├Âzetlemek i├žin:

     Script: "/tmp/src dir/test.sh"
    Calling folder: "/tmp/src dir/other"
 

Kullan─▒lan Komutlar

     echo Script-Dir : `dirname "$(realpath $0)"`
    echo Script-Dir : $( cd ${0%/*} && pwd -P )
    echo Script-Dir : $(dirname "$(readlink -f "$0")")
    echo
    echo Script-Name : `basename "$(realpath $0)"`
    echo Script-Name : `basename $0`
    echo
    echo Script-Dir-Relative : `dirname "$BASH_SOURCE"`
    echo Script-Dir-Relative : `dirname $0`
    echo
    echo Calling-Dir : `pwd`
 

Çıktı:

      Script-Dir : /tmp/src dir
     Script-Dir : /tmp/src dir
     Script-Dir : /tmp/src dir

     Script-Name : test.sh
     Script-Name : test.sh

     Script-Dir-Relative : ..
     Script-Dir-Relative : ..

     Calling-Dir : /tmp/src dir/other
 

Bkz. Https://pastebin.com/J8KjxrPF


7



─░lgili yay─▒nlar


Bir Python fonksiyonunun kaynak kodunu nas─▒l alabilirim?

stdout'un COPY'sini bash beti─činin kendi i├žinden dosyalamak i├žin y├Ânlendirir

Bir bash beti─činde bir dosyan─▒n ilk sat─▒r─▒n─▒ nas─▒l alabilirim?

Y├╝r├╝t├╝len cmdlet'in ge├žerli dizini nas─▒l al─▒n─▒r

Komut i├žindeki bir kabuk beti─činin ├ž─▒kt─▒s─▒n─▒ beti─čin i├žinde nas─▒l yeniden y├Ânlendirebilirim?

JavaScript - haftan─▒n ilk g├╝n├╝n├╝ ge├žerli tarihten al─▒n

Docker Linux konteyner bilgisini konteynerin i├žinden nas─▒l alabilirim?

Bash beti─čini python i├žinden ├žal─▒┼čt─▒rma

Ge├žerli sayfan─▒n kaynak HTML'sini chrome uzant─▒s─▒ndan alma

Bash i├žindeki bir dosyan─▒n mutlak dizinini nas─▒l alabilirim?

Etiketle ilgili di─čer sorular [bash]


Taray─▒c─▒ otomatik tamamlama ├Âzelli─čini web form alan─▒ / giri┼č etiketinde nas─▒l devre d─▒┼č─▒ b─▒rak─▒yorsunuz?

'Android.os.NetworkOnMainThreadException' ├Â─česini nas─▒l d├╝zeltebilirim?

Bir dize Bash'de bir alt dize i├žerip i├žermedi─čini kontrol etme

Sonunda bir blok her zaman Java'da y├╝r├╝t├╝l├╝r m├╝?

Ge├žerli tarihi JavaScriptÔÇÖte nas─▒l alabilirim?

ÔÇťKesme noktas─▒ ┼ču anda etkilenmeyecek. Bu dok├╝man i├žin sembol y├╝klenmemi┼č. ÔÇŁUyar─▒s─▒?

Bir nesnenin JavaScript'te belirli bir ├Âzelli─či olup olmad─▒─č─▒n─▒ nas─▒l kontrol ederim?

Node.js'deki ortam de─či┼čkenlerini okuyun

DataTable'daki LINQ sorgusu

Docker'da kal─▒c─▒ depolama (├Ârn. Veritabanlar─▒) ile nas─▒l ba┼ča ├ž─▒k─▒l─▒r