/ usr / bin / env:ln:符号链接的级别太多

时间:2014-12-15 18:53:47

标签: ruby bash rvm ubuntu-12.04 capistrano3

这个问题让我感到害怕,我觉得我已经尝试了一切。

首先,升级到Capistrano 3时问题就开始了.Capistrano现在在部署之前使用/ usr / bin / env,以确保环境设置正确。

当Capistrano创建符号链接到必要的共享目录和相应文件时,它会尝试以下命令:

/usr/bin/env ln -s /full/path /different/full/path

...然后出错:

/usr/bin/env: ln: Too many levels of symbolic links

我意识到这不是Capistrano的错,所以我开始通过ssh'ing到我的服务器进行故障排除并尝试相同的命令,并且我收到相同的错误(至少有利于一致性)。然后我在没有/ usr / bin / env的情况下尝试相同的命令:

ln -s /full/path /different/full/path

它有效!!!!也许你可以看到我不能的真正解决方案?

这里只是/ usr / bin / env命令的输出:

rvm_bin_path=/home/deployer/.rvm/bin
GEM_HOME=/home/deployer/.rvm/gems/ruby-1.9.3-p392
TERM=xterm-256color
SHELL=/bin/bash
IRBRC=/home/deployer/.rvm/rubies/ruby-1.9.3-p392/.irbrc
SSH_CLIENT=...
OLDPWD=/home/deployer/Sites/example.com
MY_RUBY_HOME=/home/deployer/.rvm/rubies/ruby-1.9.3-p392
SSH_TTY=/dev/pts/0
USER=deployer
LS_COLORS= .....
_system_type=Linux
rvm_path=/home/deployer/.rvm
SSH_AUTH_SOCK=....
rvm_prefix=/home/deployer
MAIL=/var/mail/deployer
PATH=/home/deployer/.rvm/gems/ruby-1.9.3-p392/bin:/home/deployer/.rvm/gems/ruby-1.9.3-p392@global/bin:/home/deployer/.rvm/rubies/ruby-1.9.3-p392/bin:/home/deployer/.rvm/bin:/opt/rubyee/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/deployer/.rvm/bin
PWD=/home/deployer/Sites
LANG=en_US.UTF-8
_system_arch=i386
_system_version=12.04
rvm_version=1.26.4 (latest)
SHLVL=1
HOME=/home/deployer
LOGNAME=deployer
GEM_PATH=/home/deployer/.rvm/gems/ruby-1.9.3-p392:/home/deployer/.rvm/gems/ruby-1.9.3-p392@global
SSH_CONNECTION=....
LESSOPEN=| /usr/bin/lesspipe %s
LESSCLOSE=/usr/bin/lesspipe %s %s
RUBY_VERSION=ruby-1.9.3-p392
_system_name=Ubuntu
_=/usr/bin/env

我还尝试了以下命令,以找到潜在的符号链接循环:

find . -maxdepth 20 -type l -exec ls -ld {} +

但是没有产生正确的结果:

lrwxrwxrwx 1 deployer deployer ...

2 个答案:

答案 0 :(得分:1)

您可能没有使用相同的ln实用程序。

直接从交互式shell调用时,ln可能会被覆盖,例如通过alias或某些shell函数ln() {...;}

/usr/bin/env尝试执行此操作时不会发生这种情况(AFAIK会在ln中查找PATH)。我怀疑它发现的ln有问题,所以你收到了这个错误。

这是一个可能与您的情况类似的示例场景:

# start from an empty directory
$ ls -l
total 0
# create a problematic `ln` in the current directory
$ ln -s ln ln
$ ls -l
total 0
lrwxrwxrwx 1 me me 2 Jan  7 20:28 ln -> ln
# have an alias for the "real" ln
$ alias ln=/bin/ln
# mess up PATH
$ PATH="$PWD"

现在让我们尝试两种选择,/usr/bin/env先行:

$ /usr/bin/env ln -s /some/path /tmp/path
/usr/bin/env: ln: Too many levels of symbolic links

然后简单ln(请记住我们alias编辑了它:

$ ln -s /some/path /tmp/path
$ echo $?
0
$ /bin/ls -l /tmp/path
lrwxrwxrwx 1 me me 10 Jan  7 20:31 /tmp/path -> /some/path

所以我的建议是:查看ln的问题,例如通过查找可能可见的所有不同替代方案。在bash中你可以运行:

$ type -a ln

答案 1 :(得分:0)

尝试这样找到符号链接循环:

find . -follow -printf ""