【发布时间】:2015-09-24 14:56:28
【问题描述】:
我需要你的帮助来理解 sudo 的这种行为。
sudo -s -- 'ls -l' 这个命令有效但是sudo 'ls -l' 抛出错误说
sudo: ls -l: command not found 我意识到它将引号内的整个字符串视为单个命令(包括空格),但我没有得到的是它如何与 -s 标志一起正常工作,但当 -s 不存在时失败。
【问题讨论】:
我需要你的帮助来理解 sudo 的这种行为。
sudo -s -- 'ls -l' 这个命令有效但是sudo 'ls -l' 抛出错误说
sudo: ls -l: command not found 我意识到它将引号内的整个字符串视为单个命令(包括空格),但我没有得到的是它如何与 -s 标志一起正常工作,但当 -s 不存在时失败。
【问题讨论】:
没有-s,第一个参数是要执行的命令的名称。对于-s,第一个参数是传递给用于执行参数的任何shell($SHELL 或您的系统shell)的-c 选项的字符串。
也就是说,假设$SHELL是sh,下面是等价的:
sudo -s -- 'ls -l'
sudo -- sh -c 'ls -l'
【讨论】:
sudo -- "$SHELL" -c 'ls -l'来避免你的假设。
-s 专门迎合 SHELL 未设置,所以我不得不假设一些东西,给它一个特定的值似乎更简单。
-s [命令]
-s (shell) 选项运行由 SHELL 环境变量指定的 shell(如果已设置)或指定的 shell 密码数据库。如果指定了命令,则将其传递给 通过 shell 的 -c 选项执行的 shell。如果没有命令 指定时,将执行交互式 shell。
它的行为就像它一样,因为产生了一个新的 shell,它像 shell 一样分解了“引用的命令”中的单词。
【讨论】:
"ls -l" 将产生错误ls -l: command not found,因为 shell 会按照您的要求在路径中查找带有空格的命令。