Como obter o nome completo do script de shell atual?
Pergunta
Existe uma maneira menos bruta de fazer isso?
#!/bin/ksh
THIS_SCRIPT=$(/usr/bin/readlink -f $(echo $0 | /bin/sed "s,^[^/],$PWD/&,"))
echo $THIS_SCRIPT
Estou preso usando ksh
mas preferiria uma solução que funcione bash
também (o que eu acho que isso faz).
Solução
Entrada nº 28 Nas perguntas frequentes do Bash:
Como faço para determinar a localização do meu script? Eu quero ler alguns arquivos de configuração do mesmo local.
Há duas razões iniciais pelas quais esse problema surge: você deseja externalizar dados ou configuração do seu script e precisar de uma maneira de encontrar esses recursos externos, ou seu script pretende agir sobre um pacote de algum tipo (por exemplo, uma compilação script) e precisa encontrar os recursos para agir.
É importante perceber que, no caso geral, esse problema não tem solução. Qualquer abordagem que você possa ter ouvido falar e qualquer abordagem que será detalhada abaixo tem falhas e só funcionará em casos específicos. Em primeiro lugar, tente evitar o problema inteiramente por não depender da localização do seu script!
...
Usando Bash_source
A variável Bash_Source Bash é na verdade uma matriz de nomes de caminho. Se você o expandir como uma string simples, por exemplo, "$ bash_source", você receberá o primeiro elemento, que é o nome da função ou script atualmente executando.
Outras dicas
Eu sempre fiz:
SCRIPT_PATH=$(cd `dirname ${0}`; pwd)
Eu nunca usei ReadLink antes: é apenas GNU? (ou seja, funcionará no HP-UX, AIX e Solaris Out of the Box? Dirname e PWD Will ....)
(editado para adicionar `` que eu esqueci no post original. . Primeira chamada Gets Path, a segunda chamada elimina o caminho relativo) (edite 3 erros de digitação fixa que impediam a resposta de linha única, de volta à linha única!)
Por que não pensei em tentar isso antes de fazer a pergunta?
THIS_SCRIPT=$(/usr/bin/readlink -nf "$0")
Funciona bem.