web-dev-qa-db-fra.com

commande realpath introuvable

J'ai Debian Squeeze AMD64. Mon Shell actuel est bash. Si j'écris ce qui suit dans mon terminal, cela fonctionne:

$ 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

Mon fichier test.sh ressemble à ceci:

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

Si j'essaie d'exécuter ce qui suit, j'obtiens une erreur

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

Comment puis-je utiliser la commande realpath dans un fichier bash?

Informations supplémentaires

$ 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"                                                                                                                                                                          
}           
26
Francis

Realpath est-il une commande réelle ou un script? Je vérifierais d'où ça vient.

$ type -a realpath

Je ne suis pas familier avec cet outil, et donc il ne fait probablement pas partie de votre distribution normale, peut-être qu'il est installé dans un emplacement non standard qui n'est pas présent sur $PATH mais se trouve dans votre environnement de connexion $PATH.

Dans tous les cas, la commande type ci-dessus vous montrera d'où vient la commande, à quel point vous pouvez modifier la méthode que vous l'appelez dans votre script comme suit:

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

Ou modifiez le $PATH afin qu'il inclue également cet emplacement non standard.

Fonctions dans le shell

Une grande partie de votre environnement n'est pas appelée lorsque vous appelez un script Shell. Si vous y réfléchissez, cela a beaucoup de sens, car vous ne voulez généralement pas que les scripts contiennent tous les bagages supplémentaires que l'environnement d'un utilisateur peut avoir.

Vous pouvez soit déterminer quel fichier source fournit cette fonction et soit le source, soit simplement demander à Bash d'intégrer votre environnement de connexion.

#!/bin/bash -l
echo $(realpath "$1")
10
slm

Il existe au moins deux programmes appelés realpath:

  • Un ancien programme de dos quand GNU coreutils n'incluait pas readlink -f. Il est désormais obsolète au profit de readlink -f, tant de distributions ont cessé de le porter.
  • Le programme realpath introduit dans GNU coreutils 8.15. Il est trop ancien pour être dans Debian squeeze ou même sifflant; au moment de la rédaction, Debian unstable doesn ' t expédier non plus . Ce programme est très proche de readlink -f.

Pour une raison quelconque, vous disposez d'une fonction Shell qui émule en partie le comportement de realpath. Cette émulation est partielle: si vous l'appelez sur un lien symbolique, elle ne suit pas le lien symbolique.

Comme il s'agit d'une fonction Shell, vraisemblablement chargée depuis ou via .bashrc, il est uniquement disponible pour le code exécuté dans votre shell interactif. Si vous souhaitez qu'il soit disponible pour d'autres programmes, en supposant que vous exécutez Linux, créez un script qui émule realpath:

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

(Cela n'émule pas les options de ligne de commande rarement utilisées de realpath.)

Il ne fonctionne que dans Shell, car le fichier de script a une portée différente et n'a pas accès à vos fonctions et alias locaux définis dans vos fichiers rc . Et la commande realpath n'existe pas dans votre système.

Donc, soit installez realpath à partir du package, définissez votre propre fonction (dans le cadre du script, vérifiez certains exemples ) ou sourcez le rc dans votre script où il est défini (par exemple . ~/.bashrc).


Voici les étapes pour installer realpath s'il n'est pas présent:

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

Ubuntu et Debian

Sur Debian ou Ubuntu, il semble que le realpath devrait être installé par défaut. J'ai vérifié la récente Debian 8 (Jessie) et il semble que coreutils soit installé par défaut.

Testé en utilisant de nouvelles images VM:

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

Puis en VM:

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

Au lieu de realpath, vous pouvez également utiliser readlink -f file (ou greadlink) également fourni par le package coreutils.

10
kenorb
$ Sudo apt-get install realpath
5
user175315