Significado especial de '{}' ';' com achado

0

A ação de definição do usuário é um recurso do Bash no linux. No terminal Linux, se eu escrever

root@localhost: find ~ -type f -name 'foo*' -ok ls -l '{}' ';'

então verifica se há algum nome de arquivo começando com foo e mostra os detalhes do arquivo assim:

< ls ... /home/me/bin/foo > ? y
-rwxr-xr-x 1 me me 224 2011-10-29 18:44 /home/me/bin/foo
< ls ... /home/me/foo.txt > ? y
-rw-r--r-- 1 me me 0 2012-09-19 12:53 /home/me/foo.txt

Contanto que eu pressione y , ele mostra esses resultados.

Minha pergunta é qual é o significado especial dos caracteres '{}' ';' ?

Eu li em algum lugar que {} representa o caminho atual e ';' termina o comando, mas no bash eu nunca termino uma linha com ';' .

    
por Mastan 26.06.2015 / 13:54

2 respostas

6

Estes não fazem parte do bash; find é um programa independente e não requer o bash ou até mesmo um shell POSIX para ser executado. Por exemplo, funciona bem com fish , que não é compatível com POSIX e não segue todas as mesmas regras de sintaxe do bash. Você poderia, de fato, usá-lo sem shell (por exemplo, em um contexto programático).

É por isso que (se você estiver usando um shell POSIX, ou um que tenha regras similares nessa instância), você deseja usar aspas com determinados argumentos para find , como find . -name '*foo' . A string entre aspas simples é passada sem executar nenhuma substituição ou expansão. O shell não faz nada com isso. Se você usar find . name *foo com o bash e houver arquivos correspondentes a esse glob no seu diretório atual, o que você pretendia que acontecesse provavelmente não aconteceria.

Se você usar um shell com regras diferentes, terá que levar isso em conta ao usar find . Por exemplo, você realmente não precisa citar o {} com bash , mas se você fizer a mesma coisa com fish , receberá find: missing argument to '-exec' .

As chaves encaracoladas têm um significado no bash - elas são usadas na substituição / expansão de parâmetros e em comandos de grupo. Eles têm uma espécie de propósito semelhante em find , mas é find que os analisa, não bash .

    
por 26.06.2015 / 14:20
4

Embora ambas as chaves { , } e ponto-e-vírgula ; do tenham significados especiais no bash, nesse caso é o próprio comando find que está interpretando-as, não A concha. O comando -ok de find usa a mesma sintaxe do comando -exec , portanto, você encontrará uma descrição completa nessa seção da página de manual ( man find ):

   -exec command ;
          Execute  command;  true  if 0 status is returned.  All following
          arguments to find are taken to be arguments to the command until
          an  argument  consisting of ';' is encountered.  The string '{}'
          is replaced by the current file name being processed  everywhere
          it occurs in the arguments to the command, not just in arguments
          where it is alone, as in some versions of find.  Both  of  these
          constructions might need to be escaped (with a '\') or quoted to
          protect them from expansion by the shell.
    
por 26.06.2015 / 14:08

Tags