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"
}
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.
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")
Il existe au moins deux programmes appelés realpath
:
readlink -f
. Il est désormais obsolète au profit de readlink -f
, tant de distributions ont cessé de le porter.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:
Sudo apt-get install coreutils
brew install coreutils
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
.
$ Sudo apt-get install realpath