ruby /usr文件夹/环境:ln:符号链接级别太多

wwodge7n  于 2023-01-30  发布在  Ruby
关注(0)|答案(3)|浏览(154)

这个问题要了我的命,我觉得我什么都试过了。
首先,问题是在升级到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 ...
zrfyljdw

zrfyljdw1#

您可能没有使用相同的ln实用程序。
当直接从交互式 shell 调用它时,ln可能被例如alias或某个 shell 函数ln() {...;}覆盖。
/usr/bin/env尝试这样做时,不会发生这种情况(AFAIK在PATH中查找ln)。我怀疑它找到的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
cygmwpex

cygmwpex2#

尝试以下方法查找符号链接循环:

find . -follow -printf ""
jmp7cifd

jmp7cifd3#

如果您正在使用docker,则应在您的案例中安装ruby

docker run ruby

来源

https://github.com/docker/for-win/issues/5763#issuecomment-585749243

相关问题