- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如果readlink
脚本查找链接目标的最佳可移植(POSIX?)方法是什么?和 realpath
不可用?
你愿意ls -l
, 如果它以 l
开头取->
后面的文字与 sed
并重复直到它不再以 l
开头?
最佳答案
根据 BashFAQ #29 (它也支持 GNU 查找方法 suggested by @EugeniuRosca ):
一种广泛使用(虽然不是纯 POSIX)选项是使用 perl
:
target=/path/to/symlink-name perl -le 'print readlink $ENV{target}'
->
,可以解析
ls
的输出.
# define the best readlink function available for this platform
if command -v readlink >/dev/null 2>/dev/null; then
# first choice: Use the real readlink command
readlink() {
command readlink -- "$@"
}
elif find . -maxdepth 0 -printf '%l' >/dev/null 2>/dev/null; then
# second choice: use GNU find
readlink() {
local ll candidate >/dev/null 2>&1 ||:
if candidate=$(find "$1" -maxdepth 0 -printf '%l') && [ "$candidate" ]; then
printf '%s\n' "$candidate"
else
printf '%s\n' "$1"
fi
}
elif command -v perl >/dev/null 2>/dev/null; then
# third choice: use perl
readlink() {
local candidate ||:
candidate=$(target=$1 perl -le 'print readlink $ENV{target}')
if [ "$candidate" ]; then
printf '%s\n' "$candidate"
else
printf '%s\n' "$1"
fi
}
else
# fourth choice: parse ls -ld
readlink() {
local ll candidate >/dev/null 2>&1 ||:
ll=$(LC_ALL=C ls -ld -- "$1" 2>/dev/null)
candidate=${ll#* -> }
if [ "$candidate" = "$ll" ]; then
printf '%s\n' "$1"
else
printf '%s\n' "$candidate"
fi
}
fi
readlink_recursive() {
local path prev_path oldwd found_recursion >/dev/null 2>&1 ||:
oldwd=$PWD; path=$1; found_recursion=0
while [ -L "$path" ] && [ "$found_recursion" = 0 ]; do
if [ "$path" != "${path%/*}" ]; then
cd -- "${path%/*}" || {
cd -- "$oldwd" ||:
echo "ERROR: Directory '${path%/*}' does not exist in '$PWD'" >&2
return 1
}
path=${PWD}/${path##*/}
fi
path=$(readlink "$path")
if [ -d "$path" ]; then
cd -- "$path"
path=$PWD
break
fi
if [ "$path" != "${path%/*}" ]; then
cd -- "${path%/*}" || {
echo "ERROR: Could not traverse from $PWD to ${path%/*}" >&2
return 1
}
path=${PWD}/${path##*/}
elif [ "$PWD" != "$oldwd" ]; then
path=${PWD}/$path
fi
for prev_path; do
if [ "$path" = "$prev_path" ]; then
found_recursion=1
break
fi
done
set -- "$path" "$@" # record path for recursion check
done
if [ "$path" != "${path%/../*}" ]; then
cd "${path%/*}" || {
echo "ERROR: Directory '${path%/*}' does not exist in $PWD" >&2
return 1
}
printf '%s\n' "$PWD/${path##*/}"
else
printf '%s\n' "$path"
fi
cd -- "$oldwd" ||:
}
关于shell - 如何在没有 readlink 或 realpath 的情况下递归解析符号链接(symbolic link)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31596363/
我想提取远程机器的附加 iSCSI 设备 dev_by_path="/dev/disk/by-path/ip-10.1.1.240:3260-iscsi-iqn.2013-12.com.ryussi:
我无法理解 Linux 中“readlink”系统调用的操作。 谁能用简单的例子解释一下? 最佳答案 如果您有一个符号链接(symbolic link),例如 $ ls -l /vmlinuz lrw
在这种情况下,我需要获取一个文件名,以便我可以调用 readlink() 函数。我所拥有的只是一个整数,它最初是通过 open() 命令存储为文件描述符的。问题是,我无权访问执行 open() 命令的
我一直在尝试找出一种方法来获得某种能力,以便能够在 Python 2.7 下返回 Windows 中符号链接(symbolic link)的真实绝对路径。 (我无法升级到 3.x,因为 Maya/3d
在 unistd.h 中,我有 C 函数 readlink,它跟随一个目标的链接。 coreutil readlink 有很棒的 -f 选项可以递归地跟踪每个符号链接(symbolic link)。我
我试图找到运行脚本的真实路径,但是当 $0 在一些包含空格的文件夹中时,readlink 会失败,所以我包围了 $0使用 " ,但这次 readlink 停止工作。 RPATH="$(readli
我正在编写一个 shell 脚本,其中参数将是一个位置的路径。我正在使用 readlink -f 命令来获取用户发送的路径的绝对路径。假设如果用户发送的路径有空格,比如, /home/stac
问题: 在 linux 机器上,我想读取链接的目标字符串。从文档中我找到了以下代码示例(没有错误处理): struct stat sb; ssize_t r; char * linkname; lst
与 GNU coreutils 命令等效的 Perl 命令是什么 readlink -f ? If any component of the file name except the last one
输入 sudo apt autoremove 后出现此错误在终端 readlink: missing operand Try 'readlink --help' for more informatio
我正在尝试使用 readlink -f 获取所有符号链接(symbolic link)后的共享库的绝对路径。 >readlink -f /opt/gcc4.9.3/lib64/libstdc++.so
我想要一个“readlink -f”版本,它提供它执行的每个单独符号链接(symbolic link)解析的跟踪。像这样的东西: $ linktrace /usr/lib64/sendmail /us
我正在尝试分析一些调用 readlink 的代码(不是我自己编写的)积极的bufsize ,然后测试结果是否为零。我看不出结果如何为零,我尝试过的所有内容都是-1,实际链接的大小或软链接(soft l
我正在尝试使用 perl one liner 在 unix 命令行管道中使用正则表达式匹配来打印字符串。 ls -l/APPL 给出输出 lrwxrwxrwx 1 root system 4 Nov
我正在尝试使用 perl one liner 在 unix 命令行管道中使用正则表达式匹配来打印字符串。 ls -l/APPL 给出输出 lrwxrwxrwx 1 root system 4 Nov
前段时间我问了一个关于这个主题的问题,并通过使用 Cygwin 而不是它的 XWin 实用程序“解决”了它,但我又回到了这个问题,因为 Xwin 实用程序不使用我的 GPU 并创建了一个严重的结果是模
我是一个没有经验的 Linux 程序员,正在努力学习使用 readlink()基于此 question and answer . 我调用 readlink()返回 -1 并设置 errno到 2 (
readLink() 存在于 linux 中并在 unistd.h 中定义,请提供 windows 中是否有任何类似类型的函数,否则我们是否可以制作具有类似功能的函数。我想使用相同的功能作为 read
我正在使用 Python Fuse 实现一个文件系统。目录仅包含 symlinks,因此我返回 S_IFLNK | 0777 关于 getattr 方法。 现在,当我在目录上执行 ls 时,我注意到
我在关注 http://www.linuxfromscratch.org/blfs/view/svn/general/pcre.html 安装 pcrc(操作系统:CentOS 6.6)。 我对这条线
我是一名优秀的程序员,十分优秀!