find -exec no zsh: echo funciona como esperado, a impressão não

1

Eu achei que os dois comandos a seguir produziriam a mesma coisa, mas eles não:

Comando 1:

find . -name filename -exec print '{}' \;

Comando 2:

find . -name filename -exec echo '{}' \;

Na verdade, o Comando 2 funciona como eu esperava: ele imprime o caminho relativo para todas as instâncias de filename sob .

No entanto, para o Comando 1 , recebo tantas linhas na saída quanto obtenho para o Comando 2 , mas em vez de me fornecer o caminho, cada linha diz:

find: print: No such file or directory

Eu também tentei remover as aspas de {}.

Por que o segundo comando não funciona como eu esperava que funcionasse? E por que não é possível imprimir o caminho para cada instância de filename ?

    
por Amelio Vazquez-Reina 06.10.2011 / 22:26

2 respostas

4

Contraste:

% whence -a print
print
% whence -a echo
echo
/bin/echo

Isso mostra que print existe apenas como um built-in, enquanto echo existe como um built-in e um executável. (Na verdade, seguindo o que foi mostrado acima, print e echo podem ser aliases, funções ou palavras reservadas; use whence -w para ver precisamente que tipo de objeto interno um nome representa.)

find é um comando externo, portanto não pode invocar nenhum shell embutido. Se você realmente precisar invocar os built-ins do seu shell, invoque um shell explicitamente:

find . -name filename -exec zsh -c 'print "$0"' '{}' \;

Nesse caso, não acredito que você queira que o print de zsh esteja incluído: find ' -print primary fará o trabalho, apenas de forma adequada (o zsh print incorporado expande as barras invertidas) .

find . -name filename -print

(Você pode até mesmo deixar de fora o -print aqui, porque -print é a ação padrão para find quando nenhuma ação é especificada.)

A razão pela qual existe um executável externo echo , mas nenhum chamado print é que echo é um comando padrão, portanto, ele fornece máxima disponibilidade até mesmo para programas que desejam invocá-lo sem passar por um shell. Em contraste, print é específico de zsh, portanto, somente os scripts zsh o usam em primeiro lugar.

(Ah, e no meu sistema, há um comando print , que envia arquivos para a impressora.)

    
por 07.10.2011 / 01:35
2

find pesquisa o PATH para um comando que corresponde ao que você especificar com '-exec'. echo é realmente um binário no seu sistema (para mim é /bin/each ).

print , pelo contrário, não é um binário localizado no seu sistema, mas sim um shell-builtin (procure por ele aqui ) que encontrar não pode ser executado por você.

    
por 07.10.2011 / 00:44

Tags