Posso obter o caminho absoluto para o script atual em KornShell?
Pergunta
É possível descobrir o caminho completo para o script que está sendo executado em KornShell (ksh)?
i. se meu script está em /opt/scripts/myscript.ksh
, posso programaticamente dentro desse script descobrir /opt/scripts/myscript.ksh
?
Obrigado,
Solução
Você pode usar:
## __SCRIPTNAME - name of the script without the path
##
typeset -r __SCRIPTNAME="${0##*/}"
## __SCRIPTDIR - path of the script (as entered by the user!)
##
__SCRIPTDIR="${0%/*}"
## __REAL_SCRIPTDIR - path of the script (real path, maybe a link)
##
__REAL_SCRIPTDIR=$( cd -P -- "$(dirname -- "$(command -v -- "$0")")" && pwd -P )
Outras dicas
No shell Korn, todas estas $ 0 soluções falhar se você é fonte no script em questão. A maneira correta de obter o que deseja é usar $ _
$ cat bar
echo dollar under is $_
echo dollar zero is $0
$ ./bar
dollar under is ./bar
dollar zero is ./bar
$ . ./bar
dollar under is bar
dollar zero is -ksh
Observe a última linha não? Use $ _. Pelo menos em Korn. YMMV em bash, CSH, et ai ..
Como o script foi chamado é armazenado na variável $ 0. Você pode usar readlink
para obter o nome de arquivo absoluto:
readlink -f "$0"
Bem ele me levou um tempo, mas este é tão simples que grita.
_SCRIPTDIR=$(cd $(dirname $0);echo $PWD)
desde o CD opera no shell gerou com $ () não afeta o script atual.
A $ RPATH variável contém o caminho relativo para o arquivo real ou o caminho real para um arquivo real.
CURPATH=$( cd -P -- "$(dirname -- "$(command -v -- "$0")")" && pwd -P )
CURLOC=$CURPATH/`basename $0`
if [ `ls -dl $CURLOC |grep -c "^l" 2>/dev/null` -ne 0 ];then
ROFFSET=`ls -ld $CURLOC|cut -d ">" -f2 2>/dev/null`
RPATH=`ls -ld $CURLOC/$ROFFSET 2>/dev/null`
else
RPATH=$CURLOC
fi
echo $RPATH
Isto é o que eu fiz:
if [[ $0 != "/"* ]]; then
DIR=`pwd`/`dirname $0`
else
DIR=`dirname $0`
fi
readlink -f
seria a melhor se fosse portátil, porque ele resolve cada Links encontrados para ambos os diretórios e arquivos.
No Mac OS X não há readlink -f
(exceto talvez via MacPorts), para que você só pode usar readlink
para obter o destino de um arquivo link simbólico específico.
A técnica $(cd -P ... pwd -P)
é bom, mas só funciona para ligações resolver para diretórios principais para o script, ele não funciona se o próprio script é um link simbólico
Além disso, um caso que não foi mencionado: quando você iniciar um script passando-a como um argumento para um shell (/bin/sh /path/to/myscript.sh
), $0
não é utilizável neste caso
Eu dei uma olhada para o MySQL "binários", muitos deles são scripts shell na verdade; e agora eu entendo porque eles pedem uma opção --basedir
ou necessidade de ser lançado a partir de um diretório específico de trabalho; isso é porque não há nenhuma boa solução para localizar o script alvo
Isso funciona também, embora ele não vai dar o caminho "true" se é um link. É mais simples, mas menos exato.
SCRIPT_PATH="$(whence ${0})"
Tente qual comando.
which scriptname
lhe dará o nome qualificado completo do script juntamente com o seu caminho absoluto
Eu atualizei a resposta do Edward Staudt, para ser capaz de lidar com de caminho absoluto links simbólicos, e com cadeias de ligações também.
DZERO=$0
while true; do
echo "Trying to find real dir for script $DZERO"
CPATH=$( cd -P -- "$(dirname -- "$(command -v -- "$DZERO")")" && pwd -P )
CFILE=$CPATH/`basename $DZERO`
if [ `ls -dl $CFILE | grep -c "^l" 2>/dev/null` -eq 0 ];then
break
fi
LNKTO=`ls -ld $CFILE | cut -d ">" -f2 | tr -d " " 2>/dev/null`
DZERO=`cd $CPATH ; command -v $LNKTO`
done
feio, mas funciona ... Depois de executar este, o caminho é de R $ cPath eo arquivo é de R $ CFILE
Usando $ _ fornece o último comando.
>source my_script
Obras se eu emitir o comando duas vezes:
>source my_script
>source my_script
Se eu usar uma seqüência diferente de comandos:
>who
>source my_script
A variável $ _ retornos "que"
Tente usar o seguinte:
dir = $(dirname $0)