Eu tenho o debian squeeze amd64. Meu shell atual é bash. Se eu escrever o seguinte no meu terminal, ele funcionará:
$ 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 fica 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 em um arquivo bash?
informação adicional
$ 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"
}
#!/bin/bash -l
,.realpath
. Meu sistema Fedora 19 agora inclui esta ferramenta. Observe também que o OP estava usando um kernel Debian w / 2.6, então seu sistema também estaria ausenterealpath
devido à sua idade.command
ainda eram úteis para mim. É uma maneira mais portátil de fazer o que eu estava mostrando nos shells POSIX.Existem pelo menos dois programas chamados
realpath
:readlink -f
. Agora está obsoleto em favor dereadlink -f
, muitas distribuições deixaram de carregá-lo.realpath
programa introduzido no GNU coreutils 8.15. É muito velho para estar no modo Debian ou até chiado; no momento em que escrevo, o Debian instável também não o envia . Este programa está muito próximoreadlink -f
.Por alguma razão, 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 essa é uma função do shell, presumivelmente carregada de ou via
.bashrc
, ela está disponível apenas para o código em execução no seu shell interativo. Se você deseja que ele esteja disponível para outros programas, supondo que você esteja executando o Linux, crie um script que emulerealpath
:(Isso não emula
realpath
as opções de linha de comando raramente usadas.)fonte
realpath
programa é considerado reprovado pelo coreutils ou de que não foi criado por padrão. Então o Debian deve estar removendo-o.realpath
binário próximo, mas não exatamente idênticoreadlink -f
. O Debian stable carrega 8.13. O Debian instável escolheu manter o programa legado .openssl
?Funciona apenas no shell, porque o arquivo de script tem escopo diferente e não tem acesso às funções e aliases locais definidos nos arquivos rc . E o
realpath
comando realmente não existe no seu sistema.Portanto, instale a
realpath
partir do pacote, defina sua própria função (como parte do script, verifique alguns exemplos ) ou origine o arquivo rc no seu script onde está definido (por exemplo. ~/.bashrc
).Aqui estão as etapas para instalar
realpath
se não estiver presente:sudo apt-get install coreutils
brew install coreutils
Ubuntu e Debian
No Debian ou Ubuntu, parece que
realpath
deve ser instalado por padrão. Eu verifiquei no recente Debian 8 (Jessie) e parece ter sidocoreutils
instalado por padrão.Testado usando imagens novas da VM:
Então na VM:
Em vez de
realpath
, você também pode usarreadlink -f file
(ougreadlink
) fornecido pelocoreutils
pacote.fonte
fonte