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

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

首先,升级到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 ... 

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

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

/usr/bin/env尝试这样做时(AFAIK它在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 

试试这个来找到符号链接循环:

 find . -follow -printf ""