sudo
nem suporta a sintaxe completa do "comando simples". De acordo com a página man bash, na seção Gramática da Shell:
A simple command is a sequence of optional variable assignments followed by blank-separated words and redirections, and terminated by a control operator.
Ou seja, um comando simples pode ser algo assim:
LC_ALL=C grep -i "keyword" <infile >outfile &
sudo
suporta atribuições de variáveis (como LC_ALL=C
) e um nome de comando e seus argumentos (como grep -i "keyword"
), mas não suporta redirecionamentos (como <infile >outfile
) ou operadores de controle (%código%). De fato, se você tentou usar os elementos não suportados com &
, desta forma:
sudo LC_ALL=C grep -i "keyword" <infile >outfile &
... então o shell interpretará os redirecionamentos e o plano de fundo ( sudo
) antes de executar &
e os aplicará a sudo
(não ao comando sudo
, exceto indiretamente).
Outras coisas grep
não suporta: qualquer tipo de comando complexo, incluindo pipelines, listas (vários comandos separados por sudo
ou ;
), grupos de comandos (com &
ou ( )
) , expressões condicionais e aritméticas ( { }
e [[ ]]
), operadores lógicos ( (( ))
, !
e &&
), palavras-chave ( ||
, if
, for
, while
, etc), ou aliases e funções de shell.
case
é um caso interessante, porque é uma palavra-chave shell e também um comando regular (geralmente / usr / bin / time). Quando você usa time
, ele não reconhece sudo time somecommand
como uma palavra-chave do shell, então usa a versão executável do comando regular.
Se você quiser usar a versão shell (keyword), poderá executar um shell em time
e permitir que ele reconheça a palavra-chave; algo assim:
sudo bash -c 'time echo hello'
Como isso executa um shell completo, você também pode usar qualquer outra sintaxe de shell complexa desejada neste formulário. Mas tenha cuidado ao citar e tal; O que quer que seja depois de sudo
será executado através da análise de shell (e citar e escapar da interpretação) duas vezes , por isso é fácil obter resultados inesperados.