(Mi rendo conto che è una vecchia questione, ma Google mi ha portato qui perché stavo cercando di capire esattamente che cosa changee replacefaccio e come sono diversi).
Credo che entrambi replacee changevengano utilizzati per modificare un indirizzo esistente. Ritenere:
ip addr add 192.168.1.10/32 dev dummy0
Questo mi fa:
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 eseguo nuovamente lo stesso comando, viene visualizzato un errore:
# ip addr add 192.168.111.10/32 dev dummy0
RTNETLINK answers: File exists
Se voglio modificare i flag su quell'indirizzo, posso usare changeo replace. Qui, uso ip addr changeper modificare le impostazioni preferred_lfte valid_lftsu quell'indirizzo:
# 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
Il comportamento di ip addr replaceè identico. In effetti, se guardi il codice, si traducono in azioni quasi identiche:
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);
Sembra che l'intenzione qui sia quella di changemodificare solo un indirizzo esistente, mentre replacemodificherà un indirizzo esistente o ne creerà uno nuovo se l'indirizzo specificato non esiste. In pratica, sembra che entrambi changee replaceaggiungeranno l'indirizzo se non esiste già.
Se vuoi effettivamente aggiungere un nuovo indirizzo e rimuoverne uno vecchio, dovrai farlo in due passaggi, usando ip addr delseguito da ip addr add(o viceversa, ovviamente).
NOP0s :()