Como usar a variável PATH como ponto de partida em find dentro de zsh

4

Eu tento usar $ PATH como entrada para encontrar a fim de encontrar arquivos definidos pelo meu caminho. Esta é minha tentativa:

find ${PATH//:/ } -iname "*chrome*"

Aqui eu substituo todo o : em PATH pelo espaço, então a lista de pontos iniciais parece quando você digita manualmente. O problema é que esta é a resposta:

find: ‘/home/martin/bin /home/martin/.local/bin /usr/local/sbin /usr/local/bin /usr/sbin /usr/bin /sbin /bin /usr/games /usr/local/games /snap/bin’: No such file or directory

A variável é interpretada como uma cadeia inteira em vez de vários caminhos separados por espaços.

Este problema em particular pode ser resolvido usando xargs como este:

echo $PATH | xargs -d: -Ix find x -iname "*chrome*"

Ainda estou curioso para saber como fazer a primeira tentativa funcionar. Eu aposto que um é melhor desempenho também. Estou usando o zsh no meu sistema. Obrigado

    
por Martin 24.01.2017 / 12:33

1 resposta

4

Parece que você está usando um shell como o zsh, que desativa divisão de palavras na expansão de variáveis . Se você realmente estiver usando o zsh, precisará forçar a expansão emulando sh ( emulate sh ) ou usando ${=PATH//:/ } :

$ printf "%s\n" ${PATH//:/ }
/usr/local/sbin /usr/local/bin /usr/bin
$ printf "%s\n" ${=PATH//:/ }
/usr/local/sbin
/usr/local/bin
/usr/bin
$ (emulate sh; printf "%s\n" ${PATH//:/ })
/usr/local/sbin
/usr/local/bin
/usr/bin

Se você realmente estiver usando o bash, verifique seu IFS:

$ (IFS=; printf "%s\n" ${PATH//:/ })
/usr/local/sbin /usr/local/bin /usr/bin
$ (IFS=; unset IFS; printf "%s\n" ${PATH//:/ })
/usr/local/sbin
/usr/local/bin
/usr/bin

A definição de IFS para uma cadeia vazia desativa a divisão de palavras no bash. Você pode anular IFS para obter o valor padrão e reativar a divisão de palavras.

    
por muru 24.01.2017 / 12:53