Por que a máquina 2 linux se comporta de maneira diferente com o comando da mesma sintaxe?

4

Estou usando duas máquinas, ambas Red Hat Enterprise Linux AS versão 3 (Taroon Update 2)  (Eu verifico em / etc / * - release).

Eu verifiquei que eles estão usando o mesmo shell padrão por ps -p $$ , que é bash.

Eu tentei executar um comando find com padrão curinga: find path -name pattern -type f -ctime +3

e o padrão contém * caractere como curinga.

A primeira máquina parece ter expandido o caractere curinga e causando erro:

find /home/primbat/testing -name sftp_bcs_report_*.log -type f -ctime +7
find: paths must precede expression

e eu preciso fazer o padrão entre duas qoute delimitadas, por exemplo: \"sftp_bcs_report_*.log\" ou usando set -f no script para suprimir a expansão de curingas.

Qual na outra máquina, não tem esse problema. Você tem alguma ideia?

    
por lamwaiman1988 28.03.2012 / 04:14

2 respostas

11

Por padrão, os shells expandem os curingas se um arquivo corresponder a eles, mas não serão expandidos sem correspondência. Por exemplo, se você executar touch /tmp/111; touch /tmp/11* , isso criará e atualizará o mtime em / tmp / 111, mas se / tmp estiver vazio, mas você chamar touch /tmp/11* , receberá o arquivo "11 *" em /tmp.

Esta é uma característica bastante estranha das shells. Às vezes, a expansão adequada não é possível sem hacks especiais como função intermediária. A maioria dos invólucros atuais inventam opções especiais para casos típicos; por exemplo. O "shopt -s failglob" no bash rejeita a execução de qualquer comando no qual a correspondência de caractere curinga falhe.

Deve-se confiar na expansão do caractere curinga de find, de modo que tal padrão deve ser citado contra a expansão no shell:

find /home/primbat/testing -name 'sftp_bcs_report_*.log' -type f -ctime +7

(nota aspas simples). Com zero ou um arquivo, funciona, mas com dois ou mais arquivos você tem a sintaxe de comando quebrada e reclama - isso é o que é dito pelo colega Arcege . Seu "set -f" desabilita a expansão totalmente - bem, é uma boa medida para diagnósticos, mas pode dar ancinhos subaquáticos para um futuro em movimento. As cotações são mais simples:)

    
por 28.03.2012 / 09:37
4

Parece que não há arquivo correspondente a sftp_bcs_report_*.log no diretório inicial da segunda máquina e mais de um arquivo no primeiro servidor. Para usar find , os padrões devem ser sempre citados.

    
por 28.03.2012 / 04:23