Se eu executar no script bash (semelhante a este ) para enviar conteúdo para um arquivo:
sudo ./bar.sh > foo
conteúdo bar.sh:
echo 'for pid in $(ps -ef | grep "smbd" | awk '{print $2}'); do kill -9 $pid &> /dev/null; done'
foo fora:
for pid in $(ps -ef | grep "smbd" | awk {print }); do kill -9 $pid &> /dev/null; done
$2
está perdido para fora.
saída esperada:
for pid in $(ps -ef | grep "smbd" | awk '{print $2}'); do kill -9 $pid &> /dev/null; done
Como faço para obtê-lo?
Em primeiro lugar, nunca execute coisas com
sudo
a menos que seja realmente necessário executá-las comsudo
. Eu realmente não posso enfatizar isso o suficiente. A menos que você receba um erro de "permissão negada", você não precisasudo
e não deve usar arquivossudo
. Então você não precisasudo ./bar.sh
, apenas corra./bar.sh
.Em seguida, você não precisa
echo
obter os resultados de um comando. Isso não é necessário:Tudo que você precisa é executar o comando em si. Você não precisa da substituição do comando (
$(command)
) ou do echo. Basta ter isso no seu script:Observe que, se você deseja obter o PID de um processo em execução, também não deseja
ps
. Você pode simplesmente usarpgrep smbd
o que evita o problema dogrep
próprio processo aparecer nos resultados.Por fim, se você quiser imprimir uma string de várias linhas como saída, poderá usar um documento aqui em vez de muitas instruções de eco. Então, juntando tudo isso, você deve fazer
bar.sh
assim:E, em seguida, execute-o como
./bar.sh > foo
(nãosudo
!).Ou, aqui está uma versão mais simples da mesma abordagem:
Ou, ainda mais simples:
O que nos leva ao ponto final de você tem certeza de que realmente quer um roteiro para isso? Para matar todos os
smbd
processos em execução, tudo o que você precisa é de um único comando: