(Eu sei que essa é uma pergunta antiga, mas o Google me trouxe aqui porque eu estava tentando descobrir exatamente o que changee o que replacefazer e como eles são diferentes).
Eu acredito que ambos replacee changesão usados para modificar um endereço existente. Considerar:
ip addr add 192.168.1.10/32 dev dummy0
Isso me deixa:
32: dummy0: <BROADCAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default
link/ether 5a:ec:58:4f:d1:35 brd ff:ff:ff:ff:ff:ff
inet 192.168.111.10/32 scope global dummy0
valid_lft forever preferred_lft forever
inet6 fe80::58ec:58ff:fe4f:d135/64 scope link
valid_lft forever preferred_lft forever
Se eu executar o mesmo comando novamente, recebo um erro:
# ip addr add 192.168.111.10/32 dev dummy0
RTNETLINK answers: File exists
Se eu quiser modificar os sinalizadores nesse endereço, posso usar changeou replace. Aqui, eu uso ip addr changepara modificar as configurações preferred_lfte valid_lftnesse endereço:
# ip addr change 192.168.111.10/32 dev dummy0 preferred_lft 300 valid_lft 300
# ip addr show dummy0
32: dummy0: <BROADCAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default
link/ether 5a:ec:58:4f:d1:35 brd ff:ff:ff:ff:ff:ff
inet 192.168.111.10/32 scope global dynamic dummy0
valid_lft 298sec preferred_lft 298sec
inet6 fe80::58ec:58ff:fe4f:d135/64 scope link
valid_lft forever preferred_lft forever
O comportamento de ip addr replaceé idêntico. De fato, se você olhar para o código, eles resultam em ações quase idênticas:
if (matches(*argv, "change") == 0 ||
strcmp(*argv, "chg") == 0)
return ipaddr_modify(RTM_NEWADDR, NLM_F_REPLACE, argc-1, argv+1);
if (matches(*argv, "replace") == 0)
return ipaddr_modify(RTM_NEWADDR, NLM_F_CREATE|NLM_F_REPLACE, argc-1, argv+1);
Parece que a intenção aqui é que changeapenas modifique um endereço existente, enquanto replacemodifique um endereço existente ou crie um novo se o endereço especificado não existir. Na prática, parece que ambos changee replaceadicionará o endereço se ele ainda não existir.
Se você realmente deseja adicionar um novo endereço e remover um antigo, precisará fazer isso em duas etapas, usando ip addr delseguido por ip addr add(ou vice-versa, é claro).
NOP0s :()