【问题标题】:"syntax error near unexpected token `(' " when deleting all files(s) or directory(s) using rm command with an exception使用 rm 命令删除所有文件或目录时出现“意外标记 `(' 附近的语法错误”
【发布时间】:2021-10-17 00:40:24
【问题描述】:
$ sshpass -p "$SSH_PASS" ssh student@"$IP_NFS" "sudo rm -r /srv/nfs4/share/assets_prod/!(v$TAG)"
Warning: Permanently added 'x.x.x.x' (ED0599) to the list of known hosts.
bash: -c: line 0: syntax error near unexpected token `('
bash: -c: line 0: `sudo rm -r /srv/nfs4/share/assets_prod/!(v0.0.3-rc6)'

直接到nfs服务器检查结果

student@nfs:~$ sudo echo rm -r /srv/nfs4/share/assets_prod/!(v0.0.3-rc6)
rm -r /srv/nfs4/share/assets_prod/kk.dd /srv/nfs4/share/assets_prod/kk.dkk /srv/nfs4/share/assets_prod/kk.dkkff /srv/nfs4/share/assets_prod/v0.0.3-rc2 /srv/nfs4/share/assets_prod/v0.0.3-rc3 /srv/nfs4/share/assets_prod/v0.0.3-rc4 /srv/nfs4/share/assets_prod/v0.0.3-rc5

是什么导致命令运行出现问题?

【问题讨论】:

  • 正如它所说的“sudo rm -r /srv/nfs4/share/assets_prod/!(v0.0.3-rc6)”导致错误, ( 不应该在那里。你是否仔细检查过该文件存在?还是目录?
  • 我直接在NFS服务器上检查过,结果正常,但是通过gitlab-ci运行时出现错误student@nfs:~$ sudo echo rm -r /srv/nfs4/share/assets_prod/!(v0.0.3-rc6) rm -r /srv/nfs4/share/assets_prod/kk.dd /srv/nfs4/share/assets_prod/kk.dkk /srv/nfs4/share/assets_prod/kk.dkkff /srv/nfs4/share/assets_prod/v0.0.3-rc2 /srv/nfs4/share/assets_prod/v0.0.3-rc3 /srv/nfs4/share/assets_prod/v0.0.3-rc4 /srv/nfs4/share/assets_prod/v0.0.3-rc5

标签: linux ubuntu ssh gitlab-ci nfs


【解决方案1】:

您使用了以下命令:

sudo rm -r /srv/nfs4/share/assets_prod/!(v$TAG)

但是括号对shell有特殊的意义。你最好使用

$ sshpass -p "$SSH_PASS" ssh student@"$IP_NFS" "sudo rm -r '/srv/nfs4/share/assets_prod/!(v$TAG)'"

将文字字符串传递给rm,不受外壳干扰。

【讨论】:

    【解决方案2】:

    远端真的在运行

    bash -c 'sudo rm -r /srv/nfs4/share/assets_prod/!(v$TAG)'
    

    并且为您的 interactive shell 设置的 extglob 选项未为bash -c 调用的非交互式 shell 设置。

    sshpass -p "$SSH_PASS" ssh student@"$IP_NFS" "shopt -s extglob; sudo rm -r /srv/nfs4/share/assets_prod/!(v$TAG)"
    

    应该可以。

    更新:因为extglob影响解析,必须在命令行解析前开启,但x; y在执行x之前解析完成。也许以下方法会起作用:

    sshpass -p "$SSH_PASS" ssh student@"$IP_NFS" \
      "bash -O extglob -c 'sudo rm -r /srv/nfs4/share/assets_prod/!(v$TAG)'"
    

    如果没有(或者即使有),您可以使用find

    sshpass -p "$SSH_PASS" ssh student@"$IP_NFS" \
      find /srv/nfs4/share/assets_prod \! -name "v$TAG"
    

    如果这列出了您要删除的文件,您可以在find 命令中添加-delete(如果您的find 支持)或-exec rm {} + 以实际删除它们。

    【讨论】:

    • 还是有同样的问题bash: -c: line 0: syntax error near unexpected token (' bash: -c: line 0: shopt -s extglob; sudo rm -rv /srv/nfs4/share/assets_prod/!(v0.0.3-rc9)'
    • 哦,对了。 extglob 影响解析,在shopt 实际执行之前解析整行。
    猜你喜欢
    • 2016-10-16
    • 1970-01-01
    • 2011-05-27
    • 2017-12-03
    • 1970-01-01
    • 2022-12-20
    • 2013-12-31
    • 2012-08-31
    • 2012-10-20
    相关资源
    最近更新 更多