Existem duas maneiras principais de converter um fluxo de saída em uma lista de argumentos. A maneira rápida (e às vezes suja) de fazer isso é com xargs
. Por padrão, ele aceita um fluxo de entrada padrão e executa um comando com cada linha da entrada como um argumento separado. Você deve sempre ter cuidado com o formato da entrada porque os espaços e outros caracteres são fáceis de interpretar incorretamente quando passados como argumentos. Nomes de pacotes, no entanto, são relativamente seguros. Eles não devem incluir caracteres curinga de shell ou novas linhas ou nada de louco, então aqui está o que seria para o seu comando: [3]
$ pkg_info | grep proto | sed 's/\([a-z0-9]*\).*//' | xargs pkg_deinstall -n
Um caso frequente é que você realmente precisa executar o comando uma vez para cada linha sendo processada. Nesse caso, o argumento -n
é útil. Você pode usar -n1
para executá-los um de cada vez, ou mesmo -n10
para executá-los em lotes de dez.
$ [pipline] | xargs -n1 pkg_deinstall -n
Agora, digamos que você tenha necessidade de adicionar outro argumento depois de gerado automaticamente uma vez. Nesse caso, você pode usar '-I' para especificar uma string para substituir pelos argumentos gerados automaticamente. Isso também permitirá que você faça coisas como citar o argumento, se necessário. Você pode então formatar onde os argumentos serão colocados assim: [1] [2]
$ [pipline] | xargs -n1 -I{} pkg_deinstall -n "{}" --trailing-argument
Se você quiser mais controle ou executar vários comandos para cada linha de entrada, sua próxima opção é usar um loop como este:
$ [pipline] | while read line; do
echo "Uninstalling $line..."
pkg_deinstall -n "$line"
done
Observe que o pkg_deinstall
usa automaticamente a expressão como uma correspondência parcial glob, portanto, tenha cuidado com o que você deseja que seja desinstalado. Passar o nome base de algum componente do sistema irá desinstalar não apenas esse componente, mas tudo o que tem um nome como ele ou depende dele! Isso pode ser catastrófico, portanto, sempre verifique cuidadosamente o conjunto de pacotes. Você pode usar -n
para fazer uma execução seca que mostre o que seria feito sem realmente fazer [3] e / ou -i
para executar cada etapa de forma interativa.
[1] Eu usei {}
porque o find e outras funções exec similares usam esse formato, mas qualquer string única serve.
[2] O pkg_deinstall
comando não tem nenhum argumento que viria após o patern, então este é apenas um exemplo!
[3] Eu adicionei -n
a todos os meus exemplos para que se você copiar e colar o código não fará nada, apenas mostrará um teste.