O sudo só se aplica a um comando simples?

0

O sudo só se aplica a um comando simples? Eu acho que sim a partir do exemplo a seguir. Estou correto ou não?

$  if true; then echo hello; fi
hello

$ sudo if true; then echo hello; fi
bash: syntax error near unexpected token 'then'

$ sudo ( if true; then echo hello; fi )
bash: syntax error near unexpected token 'if'

$ sudo "if true; then echo hello; fi"
[sudo] password for t: 
sudo: if true; then echo hello; fi: command not found

$ sudo " ( if true; then echo hello; fi ) "
sudo:  ( if true; then echo hello; fi ) : command not found

Mas não tenho certeza quando vejo este exemplo:

$ sudo time echo hello
hello
0.00user 0.00system 0:00.00elapsed 100%CPU (0avgtext+0avgdata 1924maxresident)k
0inputs+0outputs (0major+71minor)pagefaults 0swaps

time echo hello é um comando simples? Eu não penso assim, já que time é uma palavra-chave, não um nome de comando.

Obrigado.

    
por Tim 16.05.2018 / 03:16

1 resposta

4

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.

    
por 16.05.2018 / 05:22

Tags