Como escrever uma função de alias para tornar a barra de progresso do dd show?

1

De acordo com este artigo , substituindo:

$ dd if=/dev/sda of=/dev/sdb [additional options]

com:

$ pv -tpreb /dev/sda | dd of=/dev/sdb [additional options]

pode-se aumentar o comportamento padrão de dd exibindo uma barra de progresso, semelhante à de wget . Isso funciona bem quando eu consigo me lembrar de usá-lo, então eu pensei que aliasing o primeiro comando para o segundo era o próximo passo lógico.

Depois de algumas pesquisas, parece que um simples alias in .bash_rc não consegue fazer isso. Alguém poderia fornecer uma função BASH para capturar o if=... e trabalhá-lo no comando resultante?

    
por James Fu 11.03.2014 / 08:01

2 respostas

2

Sua pergunta não está muito clara, mas parece que você precisa de uma função de shell. Você poderia criar uma função mydd :

mydd() { pv -tpreb /dev/sda | dd "$@"; }

e invoque-o dizendo:

mydd of=/dev/sdb [additional options]

e o comando executado seria:

pv -tpreb /dev/sda | dd of=/dev/sdb [additional options]
    
por 11.03.2014 / 08:10
2

Os aliases são adequados apenas para fornecer um comando a um nome mais curto ou fornecer argumentos extras. Para qualquer outra coisa, use uma função. Vejo Aliases vs funções vs scripts para obter mais detalhes.

pvdd () {
  pv -tpreb "$1" | dd of="$2"
}
pvdd /dev/sda /dev/sdb

No entanto, não use esta função. dd if=foo of=bar é equivalente a cat <foo >bar , somente

O uso de dd como um comando de baixo nível para acessar discos é um mito¹. A mágica vem das entradas /dev , não de dd .

Então o comando que você quer é simplesmente

pv -tpreb /dev/sda >/dev/sdb

e você pode criar um alias para dd -tpreb , se quiser.

¹ Há uma origem histórica neste mito: ao acessar fitas, o controle sobre o tamanho de bloco que o dd fornece é algumas vezes necessário. Mas para todo o resto, impor um tamanho de bloco da mesma maneira que o dd pode levar à perda de dados.

    
por 12.03.2014 / 01:27