You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

sudo执行以连字符开头的命令时触发非法选项错误的原因咨询

sudo执行以连字符开头的命令时触发非法选项错误的原因咨询

嘿,我碰到过一模一样的问题!咱们来掰扯清楚到底是怎么回事:

首先,你用sudo --login --user=maria -- "$COMMAND"执行普通命令没问题,但碰到以-开头的命令(比如-do-things-)就报-sh: 0: Illegal option -d,核心原因出在**--login选项的执行逻辑**上,和你用不用--分隔sudo选项没关系!

你已经知道sudo的--是用来区分自身选项和要执行的命令,这步没错,但当你加了--login(也就是-i)后,sudo的执行流程变了:

sudo会调用目标用户的登录shell,并把你指定的命令传递给这个shell处理,而不是直接执行命令本身。

登录shell在启动时,会把接收到的命令参数当成shell的启动选项来解析——比如-do-things-会被shell拆解成-d、-o、-t等一串选项,但你的shell(比如sh)根本没有-d这个启动选项,自然就报错了。

那怎么解决?给你几个实用的方案:

  • 方案1:明确告诉shell要执行的是命令,不是选项
    用shell的-c参数来指定要执行的命令,让shell跳过启动选项解析,直接执行命令:
    sudo --login --user=maria -- sh -c "-do-things-"
    
    如果命令在当前目录,也可以写成sh -c "./-do-things-",效果一样。
  • 方案2:如果不需要登录环境,直接去掉--login
    要是你的场景不需要加载目标用户的登录shell配置(比如.profile、.bashrc这些),直接用普通sudo执行就行,这时候sudo会直接运行命令,不会经过登录shell,自然就不会有选项解析的问题:
    sudo --user=maria -- "-do-things-"
    
  • 方案3:用路径形式指定命令
    把命令写成相对路径(比如./-do-things-)或绝对路径(比如/bin/-do-things-),这样shell会识别出这是一个可执行文件路径,而不是启动选项:
    sudo --login --user=maria -- "./-do-things-"
    

再补个小验证:你可以试试在普通shell里直接运行sh "-do-things-",同样会报 Illegal option -d,这就能确认是shell的问题,不是sudo的锅~

备注:内容来源于stack exchange,提问作者V. Bozz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.17 07:59:38