存在时没有这样的文件

Sig*_*Sig 16 alpine-linux

这怎么可能?

bash: /usr/local/phantomjs/bin/phantomjs: No such file or directory
bash-4.3# cd /usr/local/phantomjs/bin
bash-4.3# ls
phantomjs
bash-4.3#
Run Code Online (Sandbox Code Playgroud)

内容/usr/local/phantomjs/binphantomjs文件,但是当我尝试执行它时,它看起来不存在。

仅供参考,我使用的是 Alpine linux 3.3

更新1

bash-4.3# ls -lF /usr/local/phantomjs/bin/phantomjs
-rwxr-xr-x    1 root     root      67932064 Jan 25  2016 /usr/local/phantomjs/bin/phantomjs*
bash-4.3# lf -lF /usr/local/phantomjs/bin
bash: lf: command not found
bash-4.3# ls -lF /usr/local/phantomjs/bin
total 66340
-rwxr-xr-x    1 root     root      67932064 Jan 25  2016 phantomjs*
Run Code Online (Sandbox Code Playgroud)

更新2

bash-4.3# file /usr/local/phantomjs/bin/phantomjs
bash: file: command not found
bash-4.3# head -n1 /usr/local/phantomjs/bin/phantomjs
ELF>xvA@`?
Q?t/lib64/ld-linux-x86-64.so.2GNUGNU????!?`?L`?L^|????????h?TT@T@DD`??`?L`?P?tddB?dB?dB??g
Run Code Online (Sandbox Code Playgroud)

更新3

bash-4.3# echo $PATH
/usr/local/phantomjs/bin:/usr/local/ruby/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
bash-4.3# ruby -v
ruby 2.1.10p492 (2016-04-01 revision 54464) [x86_64-linux]
Run Code Online (Sandbox Code Playgroud)

更新4

bash-4.3# strace /usr/local/phantomjs/bin/phantomjs
execve("/usr/local/phantomjs/bin/phantomjs", ["/usr/local/phantomjs/bin/phantom"...], [/* 13 vars */]) = -1 ENOENT (No such file or directory)
writev(2, [{"strace: exec: No such file or di"..., 39}, {"\n", 1}], 2strace: exec: No such file or directory
) = 40
writev(2, [{"", 0}, {NULL, 0}], 2)      = 0
getpid()                                = 12
exit_group(1)                           = ?
+++ exited with 1 +++
Run Code Online (Sandbox Code Playgroud)

谢谢

saw*_*ust 6

当 shell 找不到可执行文件的依赖项时,shell 将为该可执行文件报告不明确的“没有这样的文件或目录”。
缺少的依赖项通常是必需的共享库或动态加载程序。

使用strace命令显式查看在执行请求期间失败的open()系统调用(例如strace /usr/local/phantomjs/bin/phantomjs)。

附录

execve("/usr/local/phantomjs/bin/phantomjs", ["/usr/local/phantomjs/bin/phantom"...], [/* 13 vars */]) = -1 ENOENT (No such file or directory)
Run Code Online (Sandbox Code Playgroud)

evecve 系统调用返回错误代码 ENOENT,手册页将其描述为“文件文件或脚本或 ELF 解释器不存在,或者找不到文件或解释器所需的共享库”。

通常我看到 strace 为丢失的文件提供更好的分辨率。
下一步是检查可执行文件的依赖关系。
使用strings命令提取在可执行文件开头列出的动态链接器/加载器、共享库和入口点。

strings /usr/local/phantomjs/bin/phantomjs | less
Run Code Online (Sandbox Code Playgroud)

对于您可以在此列表中识别的每个文件名,您必须验证该文件是否安装在您的根文件系统中。

$ file modetest
modetest: ELF 32-bit LSB  executable, ARM, EABI5 version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 3.10.0, stripped

$ strings modetest | less
/lib/ld-linux-armhf.so.3    <=
libdrm.so.2    <=
drmModeFreeObjectProperties
drmModeFreePlaneResources
_ITM_deregisterTMCloneTable
 ...
libpthread.so.0    <=
pthread_join
pthread_create
__errno_location
 ...
libc.so.6    <=
strcpy
exit
mmap64
 ...
Run Code Online (Sandbox Code Playgroud)

在您之前的 Update2 中,第一个文件将是/lib64/ld-linux-x86-64.so.2