ln并不总是通过SSH工作

ln not always working over SSH

我正在使用 GitLab 的 CD 制作部署脚本。我有一个脚本:

- ssh USER@HOST "cd domains/$DOMAIN/ && mkdir build-$CI_JOB_ID"
- rsync -ar --port=22 * USER@HOST :domains/$DOMAIN/build-$CI_JOB_ID
- ssh USER@HOST  "cd domains/$DOMAIN/ && ln -sfv build-$CI_JOB_ID/public public_html && ls -la"
- ssh USER@HOST  "cd domains/$DOMAIN/ && ls | grep '^build\-.*$' | grep -Ev '^build-$CI_JOB_ID$' | xargs rm -rf"

一切正常,但 ln 命令无效。它只有 50% 的时间有效。这是一个接一个运行的作业的日志。

$CI_JOB_ID = 76337215 的作业 1 工作正常。 Link 正确。

$ ssh USER@HOST "cd domains/$DOMAIN/ && ln -sfv build-$CI_JOB_ID/public public_html && ls -la"
public_html -> build-76337215/public
total 20
drwx--x--x   5 USER  1000   7 Jun 20 22:15 .
drwx--x--x  23 USER  1000  23 Jun 19 16:34 ..
-rw-r--r--   1 USER  1000  39 Jun 17 22:12 .htaccess
drwxr-xr-x  12 USER  1000  20 Jun 20 22:07 build-76335972
drwxr-xr-x  12 USER  1000  20 Jun 20 22:14 build-76337215
drwxr-xr-x   2 USER  1000   4 Jun 20 11:48 logs
lrwxr-xr-x   1 USER  1000  21 Jun 20 22:15 public_html -> build-76337215/public

作业 2 $CI_JOB_ID = 76339729 没有成功。 Link 仍然是作业 1 中的旧 76337215

$ ssh USER@HOST "cd domains/$DOMAIN/ && ln -sfv build-$CI_JOB_ID/public public_html && ls -la"
public_html/public -> build-76339729/public
total 20
drwx--x--x   5 USER  1000   7 Jun 20 22:28 .
drwx--x--x  23 USER  1000  23 Jun 19 16:34 ..
-rw-r--r--   1 USER  1000  39 Jun 17 22:12 .htaccess
drwxr-xr-x  12 USER  1000  20 Jun 20 22:14 build-76337215
drwxr-xr-x  12 USER  1000  20 Jun 20 22:28 build-76339729
drwxr-xr-x   2 USER  1000   4 Jun 20 11:48 logs
lrwxr-xr-x   1 USER  1000  21 Jun 20 22:15 public_html -> build-76337215/public

我做错了什么?为什么它不是 100% 的时间工作?

问题是,如果 public_html 已经存在并且是一个目录(或者是目录的符号 link),那么您的 ln 命令会创建一个新的 link 在该目录中,而不是替换 public_html.

使用 -T 选项来避免这种情况:

ln -sfTv build-$CI_JOB_ID/public public_html

或者,您可以使用 -n 选项不取消引用 link

ln -sfnv build-$CI_JOB_ID/public public_html

如果它是 symlink,这将替换 public_html,如果它是真实目录,则在子目录中创建 symlink(-T 会在后一种情况)。