我有 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
(或) 。greadlink
coreutils
答案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