comando realpath não encontrado

24

Eu tenho o debian squeeze amd64. Meu shell atual é bash. Se eu escrever o seguinte no meu terminal, funciona:

$ uname -a
Linux core 2.6.32-5-amd64 #1 SMP Fri May 10 08:43:19 UTC 2013 x86_64 GNU/Linux
$ echo $SHELL
/bin/bash                                                                                                                                                                                     
$ echo $(realpath test.sh)                                                                                                                                                     
/home/ffortier/test.sh

Meu arquivo test.sh é assim:

#!/bin/bash
echo $(realpath "$1")

Se eu tentar executar o seguinte, recebo um erro

$ ./test.sh test.sh 
./test.sh: line 2: realpath: command not found

Como posso usar o comando realpath dentro de um arquivo bash?

Informações adicionais

$ type -a realpath
realpath is a function                                                                                                                                                                        
realpath ()                                                                                                                                                                                   
{                                                                                                                                                                                             
    f=$@;                                                                                                                                                                                     
    if [ -d "$f" ]; then                                                                                                                                                                      
        base="";                                                                                                                                                                              
        dir="$f";                                                                                                                                                                             
    else                                                                                                                                                                                      
        base="/$(basename "$f")";                                                                                                                                                             
        dir=$(dirname "$f");                                                                                                                                                                  
    fi;                                                                                                                                                                                       
    dir=$(cd "$dir" && /bin/pwd);                                                                                                                                                             
    echo "$dir$base"                                                                                                                                                                          
}           
    
por Francis 13.11.2013 / 21:07

4 respostas

9

O realpath é um comando real ou um script? Eu verificaria para ver de onde vem.

$ type -a realpath

Eu não estou familiarizado com essa ferramenta, e provavelmente não faz parte de sua distribuição normal, talvez ela esteja instalada em um local não padrão que não esteja presente no $PATH do Bash, mas esteja no% co_de do seu ambiente de login %.

Em qualquer caso, o comando $PATH acima mostrará de onde o comando está vindo, ponto no qual você pode alterar o método que está chamando no script da seguinte forma:

echo $(/path/to/realpath test.sh)

Ou altere o type do seu script para que também inclua esse local não padrão.

Funções no shell

Grande parte do seu ambiente não é chamado quando você invoca um script de shell. Se você pensar sobre isso, isso faz muito sentido, já que você geralmente não quer que os scripts tenham toda a bagagem adicional que o ambiente de um usuário possa ter.

Você pode determinar qual arquivo de origem está fornecendo essa função e fornecê-la ou simplesmente instruir o Bash a incorporar seu ambiente de login.

#!/bin/bash -l
echo $(realpath "$1")
    
por 13.11.2013 / 21:13
26

Existem pelo menos dois programas chamados realpath :

  • Um programa antigo de volta quando o GNU coreutils não incluía readlink -f . Agora está obsoleto em favor de readlink -f , então muitas distribuições pararam de carregá-lo.
  • O programa realpath introduzido no GNU coreutils 8.15. Isso é muito antigo para ser usado no Debian squeeze ou até mesmo wheezy; no momento em que este artigo foi escrito, o instável do Debian também não o enviou . Este programa está muito próximo de readlink -f .

Por algum motivo, você tem uma função shell que emula parcialmente o comportamento de realpath . Essa emulação é parcial: se você a chamar em um link simbólico, ela não seguirá o link simbólico.

Como esta é uma função do shell, supostamente carregada de ou via .bashrc , ela está disponível apenas para códigos em execução no shell interativo. Se você quiser que ele esteja disponível para outros programas, supondo que você esteja executando o Linux, crie um script que emule realpath :

#!/bin/sh
readlink -f -- "$@"

(Isso não emula as opções de linha de comando raramente usadas do realpath .)

    
por 18.11.2013 / 01:58
5
$ sudo apt-get install realpath
    
por 16.06.2016 / 03:27
5

Funciona apenas no shell, porque o arquivo de script tem um escopo diferente e não tem acesso às suas funções e aliases locais definidos em seus arquivos rc . E o comando realpath , na verdade, não existe no seu sistema.

Então, instale realpath do pacote, defina sua própria função (como parte do script, verifique alguns exemplos ) ou fonte do arquivo rc em seu script onde ele está definido (por exemplo, . ~/.bashrc ).

Aqui estão os passos para instalar o realpath , se não estiver presente:

  • Ubuntu: sudo apt-get install coreutils
  • OS X: brew install coreutils

Ubuntu e amp; Debian

No Debian ou Ubuntu, parece que o realpath deve ser instalado por padrão. Eu verifiquei no Debian 8 recente (Jessie) e ele parece ter coreutils instalado por padrão.

Testado usando imagens de VM novas:

$ vagrant init debian/jessie64 && vagrant up --provider virtualbox && vagrant ssh
$ vagrant init ubuntu/vivid64 && vagrant up --provider virtualbox && vagrant ssh

Em seguida, na VM:

$ type -a realpath
realpath is /usr/bin/realpath

Em vez de realpath , você também pode usar readlink -f file (ou greadlink ) fornecido pelo pacote coreutils .

    
por 29.09.2015 / 12:53