"syntax error near unexpected token `(' "使用 rm 命令删除所有文件或目录时,但有异常


$ 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

是什么原因导致命令在运行时出现问题?

远程端真的在运行

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

并且为交互式外壳设置的extglob选项未针对bash -c调用的非交互式外壳设置。

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

应该工作。

更新:由于extglob影响解析,因此必须在解析命令行之前启用它,但在执行x之前完成解析x; y。也许以下内容会起作用:

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"

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

您已使用以下命令:

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

但括号对外壳有特殊的含义。 你最好使用

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

将文字字符串传递给rm,没有外壳干扰。

最新更新