Por exemplo, se eu quiser criar um arquivo e inserir texto em uma linha, posso redirecionar a saída para um arquivo com o uso do >
operador:
echo "something" > /path/foobar
mas se eu não tenho acesso à pasta /path/
e preciso de privilégios sudo, como posso obter esse mesmo comando que um usuário normal com direitos sudo?
eu tentei
sudo echo "something" > /path/foobar
mas isso não funciona, porque o sudo conta apenas edit
para a parte correta
do>
Claro, eu poderia me tornar root antes com sudo su
ou usar tee
:
echo "something" | sudo tee /path/foobar
Mas gostaria de encontrar uma solução em que possa trabalhar com a última linha como substituição via
sudo !!
Não existe uma maneira de "reciclar" a última linha e apenas adicionar sudo
na frente?
bash
sudo
command-history
rubo77
fonte
fonte
alias sudo !!
?Respostas:
Você não pode simplesmente ficar
sudo
na frente de um comando do shell; é necessário invocar um shell para avaliar esse comando novamente (fazendo coisas como expandir variáveis, abrir arquivos para operadores de redirecionamento etc.). Então isso éexceto que isso não funciona muito bem, porque
!!
interpola o texto do comando anterior, caracteres especiais e tudo. Você precisa recuperar o texto do comando como uma sequência e passar isso como argumento parash
. Felizmente, da festafc
embutido permite que você faça that¹.Ou ainda, para ter certeza de invocar a mesma versão do bash atualmente em execução:
Observe que, como o comando é executado em um processo de shell separado, ele herda variáveis de ambiente (somente as que
sudo
preservam, lembre-se), mas não as variáveis internas do shell. As opções de shell (por exemplokshglob
) e outras configurações também serão iniciadas a partir do padrão.O mesmo comando² funciona em zsh e ksh, embora o ATT ksh93 exija que o número
first
e olast
número sejam passados parafc
³ (que também funciona no bash, zsh e pdksh / mksh):Usar
$0
para designar o executável do shell em execução funcionará apenas se o shell tiver sido chamado por meio do $ PATH e o $ PATH não tiver sido alterado ou por um caminho absoluto.Aqui está outro método no zsh que é um pouco mais claro, mas mais longo:
Uma palavra final de aviso:
sudo
é para comandos potencialmente perigosos. Não facilite muito o uso!¹ Há algum espaço em branco extra no começo e a substituição do comando retira novas linhas no final, mas a sintaxe do shell não se importa com isso.
² Não acho que zsh ou ksh tenham algo como o bash
$BASH
;$0
só funciona quando é um caminho absoluto ou quando não contém barra e o caminho de busca do comando não foi alterado.³ é um apelido para no ATT ksh, mas é tão bom quanto.
fc
hist
fonte
Se você deseja refazer o mesmo comando com o sudo !! depois de executar um comando como este:
Você usa a sintaxe de substituição global para recuperar o comando:
Use um espaço após o parâmetro -a .
Isso é equivalente a sudo !! mas ajuda a ignorar as restrições de sudo para <e>. Porque o sudo não permite que você use [<,>].
Para ignorar as restrições do sudo em geral para redirecionamentos, você pode usá-lo assim:
O comando tee permitirá que você leia da entrada padrão e grave na saída e nos arquivos padrão
Se você deseja repetir o comando e anexar um texto ao arquivo, o comando tee possui a opção -a para anexar. Então você pode se lembrar do comando com
e o texto será anexado ao arquivo
exemplo:
fonte
-a
realmente necessário?>
irá substituir um arquivo,tee -a
irá acrescentar, o que seria>>
Parece ser tão simples quanto
sudo sh -c "!!"
:fonte
echo "foo bar"
que seria osh -c "echo "foo bar""
que seria impresso emfoo
vez defoo bar
.sudo sh -c '!!'
vez se o seu comando, mas que não quer trabalhara=b
e entãoecho "$a" >file
e, em seguidasudo sh -c '!!'
, expandiria para osudo sh -c 'echo $a >file'
qual imprimiria uma linha vazia em vez deb
parafile
.sudo
para obter um shell raiz e, em seguida, copiar e colar o comando nele seria o mais próximo, mas falha se se espera que o comando use variáveis definidas no seu shell não raiz. O usosudo sh -c "!!"
funciona bem para comandos simples, mas é complicado para comandos complexos. Penso que o melhor conselho é não esperar que exista algum comando que funcione 100% do tempo - aprenda algumas soluções possíveis e aplique cada uma delas quando for mais adequado.