pka*_*mol 2 bash shell gitlab gitlab-ci
在 gitlab-ci 作业中,我想使用作业 id 创建一个目录(在远程服务器上),并或多或少地执行一些操作,如下所示:
- ssh user@server mkdir -p /user/$CI_JOB_ID
- ssh user@server <perform_some_action_that_creates_several_zip_files>
- LAST_MODIFIED_FILE=$(ssh user@server bash -c 'find /user/$CI_JOB_ID -iname "*.zip" | tail -n 1 | xargs readlink -f')
Run Code Online (Sandbox Code Playgroud)
该目录确实已创建,并且创建多个 zip 的操作也已完成。
但是,我用于获取最后修改/创建的最后一个命令.zip不起作用,因为$CI_JOB_ID似乎没有扩展。
有什么建议么?
此问题是由于您的 ssh 调用造成的。您现在这样做的方式是混合上下文:
ssh user@server bash -c 'find /user/$CI_JOB_ID -iname "*.zip" | tail -n 1 | xargs readlink -f'
Run Code Online (Sandbox Code Playgroud)
bash -c 'my_commands':您使用简单的引号,因此 ssh 将准确执行指令my_commands。在您的情况下,它将尝试查找 的远程值$CI_JOB_ID,而不是使用本地值。
ssh user@server bash -c "my_commands":使用 时ssh,要在远程 shell 上执行的命令作为单个字符串发送。因此,如果您要使用此引用运行 ssh,它将尝试运行"bash -c find ... | tail ... | xargs ...". 这里,只有 find是贯穿的bash -c。
对于您的情况,只需直接编写以下语句即可解决问题:
ssh user@server "find /user/$CI_JOB_ID -iname '*.zip' | tail -n 1 | xargs readlink -f"
Run Code Online (Sandbox Code Playgroud)
否则,如果您想继续使用该bash -c语法,则必须转义引号,以便将其传播到远程计算机:
ssh user@server bash -c \"find /user/$CI_JOB_ID -iname '*.zip' | tail -n 1 | xargs readlink -f\"
Run Code Online (Sandbox Code Playgroud)