未找到 realpath 命令

未找到 realpath 命令

我有 Debian 挤压 amd64。我当前的 shell 是 bash。如果我在终端中编写以下内容,它就会起作用:

$ 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

我的 test.sh 文件如下所示:

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

如果我尝试执行以下命令,则会出现错误

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

如何在 bash 文件中使用 realpath 命令?

附加信息

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

答案1

至少有两个程序称为realpath

  • 一个旧程序,当时 GNU coreutils 不包含readlink -f.它现在已被弃用readlink -f,因此许多发行版已停止携带它。
  • realpath程序在 GNU coreutils 8.15 中引入。这对于 Debian 来说太旧了,甚至无法被压缩;在撰写本文时,Debian不稳定版也不提供它。这个程序非常接近readlink -f

由于某种原因,您有一个 shell 函数,它部分模拟realpath.这种模拟是部分的:如果您在符号链接上调用它,它不会遵循符号链接。

由于这是一个 shell 函数,可能是从 或 via 加载的.bashrc,因此它仅适用于在交互式 shell 中运行的代码。如果您希望它可供其他程序使用,假设您运行的是 Linux,请创建一个模拟的脚本realpath

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

(这不会模拟realpath很少使用的命令行选项。)

答案2

它仅在 shell 中工作,因为脚本文件具有不同的范围,并且无法访问您的本地函数和别名中定义的RC文件。而realpath命令实际上并不存在于你的系统中。

realpath因此,要么从包中安装,要么定义您自己的函数(作为脚本的一部分,检查一些例子)或来源RC文件中定义它的脚本(例如. ~/.bashrc)。


realpath如果不存在,请按照以下步骤进行安装:

  • 乌班图:sudo apt-get install coreutils
  • 操作系统:brew install coreutils

乌班图 & 德班

在 Debian 或 Ubuntu 上,似乎应该realpath默认安装。我检查了最近的 Debian 8 (Jessie),它似乎已经coreutils默认安装。

使用新的 VM 映像进行测试:

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

然后在虚拟机中:

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

除了 之外realpath,您还可以使用包提供的readlink -f file(或) 。greadlinkcoreutils

答案3

realpath 是实际命令还是脚本?我会检查它来自哪里。

$ type -a realpath

我不熟悉这个工具,因此它可能不是您正常发行版的一部分,也许它安装在非标准位置,该位置不存在于 Bash 上,$PATH但位于您的登录环境的$PATH.

无论如何,上面的type命令都会向您显示命令的来源,此时您可以更改在脚本中调用它的方法,如下所示:

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

或者修改您的脚本,$PATH使其也包含此非标准位置。

shell 中的函数

当您调用 shell 脚本时,大部分环境不会被调用。如果您考虑一下这一点,这很有意义,因为您通常不希望脚本具有用户环境可能具有的所有额外包袱。

您可以确定哪个源文件提供此功能并获取它,或者只是指示 Bash 合并您的登录环境。

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

答案4

$ sudo apt-get install realpath

相关内容