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,

Foi útil?

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)
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top