【问题标题】:sudo command behaviour with quotes带引号的 sudo 命令行为
【发布时间】:2015-09-24 14:56:28
【问题描述】:

我需要你的帮助来理解 sudo 的这种行为。

sudo -s -- 'ls -l' 这个命令有效但是sudo 'ls -l' 抛出错误说 sudo: ls -l: command not found 我意识到它将引号内的整个字符串视为单个命令(包括空格),但我没有得到的是它如何与 -s 标志一起正常工作,但当 -s 不存在时失败。

【问题讨论】:

    标签: linux bash unix sudo


    【解决方案1】:

    没有-s,第一个参数是要执行的命令的名称。对于-s,第一个参数是传递给用于执行参数的任何shell($SHELL 或您的系统shell)的-c 选项的字符串。

    也就是说,假设$SHELLsh,下面是等价的:

    sudo -s -- 'ls -l'
    sudo -- sh -c 'ls -l'
    

    【讨论】:

    • 你可以写sudo -- "$SHELL" -c 'ls -l'来避免你的假设。
    • -s 专门迎合 SHELL 未设置,所以我不得不假设一些东西,给它一个特定的值似乎更简单。
    • 啊,是的 - 它使答案易于管理。我撤回我的建议。
    【解决方案2】:

    来自sudo man page

    -s [命令]

    -s (shell) 选项运行由 SHELL 环境变量指定的 shell(如果已设置)或指定的 shell 密码数据库。如果指定了命令,则将其传递给 通过 shell 的 -c 选项执行的 shell。如果没有命令 指定时,将执行交互式 shell。

    它的行为就像它一样,因为产生了一个新的 shell,它像 shell 一样分解了“引用的命令”中的单词。

    【讨论】:

    • 所以如果没有 -s 选项,sudo 命令的行为会将引号中提到的所有内容视为一个命令。
    • 正确。您可以在交互式 shell 的命令行上自己尝试此操作,其中"ls -l" 将产生错误ls -l: command not found,因为 shell 会按照您的要求在路径中查找带有空格的命令。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多