Estou tentando descobrir quais palavras a -i
opção interativa de cp
aceita como entrada.
Para sua conveniência, aqui está o código que configura arquivos para experimentação.
touch example_file{1..3}
mkdir example_dir
cp example_file? example_dir
cp -i example_file? example_dir
O shell então pergunta interativamente para cada arquivo se ele deve ser sobrescrito. Parece aceitar todos os tipos de entrada aleatória.
cp: overwrite 'example_dir/example_file1'? q
cp: overwrite 'example_dir/example_file2'? w
cp: overwrite 'example_dir/example_file3'? e
Eu tentei olhar para o código-fonte decp
, mas não conheço C e pesquisar overwrite
não ajuda.
Tanto quanto eu posso dizer, ele aceita algumas palavras como confirmação para substituição, e todo o resto é considerado um não. O problema é que até palavras como ys
parecem ser aceitas como yes
, então não sei o que funciona e o que não funciona.
Eu gostaria de saber exatamente como isso funciona e ter alguma prova disso por meio de documentação ou trechos inteligíveis de código-fonte.
A norma POSIX especifica apenas que a resposta precisa ser "afirmativa" para que a cópia seja realizada quando
-i
estiver em vigor.Para GNU
cp
, a entrada real nesse ponto é tratada por uma função chamadayesno()
. Esta função é definida nolib/yesno.c
arquivo na distribuição de origem do gnulib e se parece com isso:Se NLS ("National Language Support") não for usado, você poderá ver que a única resposta para a qual a função retorna true é uma resposta que começa com um caractere maiúsculo ou minúsculo
Y
. Qualquer entrada adicional ou outra é descartada.Se NLS for usado, a
rpmatch()
função será chamada para determinar se a resposta foi afirmativa ou não. O objetivo darpmatch()
função da biblioteca NLS é determinar se uma determinada string é afirmativa ou não (com suporte para internacionalização).Em sistemas BSD, a função correspondente é encontrada em
src/bin/cp/utils.c
:Isso é essencialmente o mesmo que o caminho de código não NLS no código GNU.
Se você olhar o código-fonte e procurar por
interactive
você pode ver que ele definex.interactive = I_ASK_USER;
, então você pode pesquisar neste e em outros arquivos ondeI_ASK_USER
está marcado.Em
copy.c
você encontrará este símbolo próximo a uma chamada de funçãooverwrite_ok
, e esta função contém uma chamada para uma funçãoyesno
.O resto fica como exercício para o leitor. ;-)