Observe que há um problema no seu código. Deixar $*
sem aspas nunca faz sentido. $*
é a concatenação dos parâmetros posicionais com o primeiro caractere de $IFS
. E então, embora existam algumas variações no comportamento quando o IFS está vazio, isso está sujeito à divisão de palavras e geração de nome de arquivo. Aqui você quer:
#!/bin/sh -
exec /bin/cp --reflink=auto "$@"
"$@"
expande para todos os parâmetros posicionais como argumentos separados.
Se você deseja atualizar /bin/cp
e a alteração a ser preservada nas atualizações, a maioria dos sistemas terá uma maneira canônica de fazer isso. No Debian e nos derivados, você faria:
$ sudo dpkg-divert --local --rename /bin/cp
Adding 'local diversion of /bin/cp to /bin/cp.distrib'
Em seguida, escreva /bin/cp
como:
#! /bin/sh -
exec "$0.distrib" --reflink=auto "$@"
Cada atualização de coreutils atualizará cp.distrib
em vez de cp
.
Observe que há uma implicação de desempenho na qual ele precisa carregar e executar sh
antes de executar cp
. Isso não é tão ruim no Debian, onde /bin/sh
é baseado em dash
.
Isso também significa que as mensagens de erro e as mensagens de ajuda mencionarão cp.distrib
em vez de cp
:
$ cp
/bin/cp.distrib: missing file operand
Try '/bin/cp.distrib --help' for more information.
Na última parte, você pode trabalhar escrevendo o script como:
#! /bin/bash -
exec -a "$0" "$0.distrib" --reflink=auto "$@"
(mesmo com ksh93
ou zsh
, todos como bash
de shells em comparação com dash
).
Ele não será estritamente equivalente, pois $0
conterá o caminho para esse script, em vez do argv[0]
cp
inicialmente recebido, mas pelo menos será algo como /bin/cp
em vez de /bin/cp.distrib
. / p>