backticks dentro da expansão de chaves

3

Estou tentando listar os arquivos dos processos httpd e tentei fazer isso:

ls -l /proc/{'pidof httpd | tr ' ' ',''}/
ls: cannot access /proc/{{28493,28492,28491,28490,28489,28488,28487,28486,28483}}/: No such file or directory

Mas se eu colocar o PID dentro dos colchetes eu mesmo, funciona:

ls -l /proc/{28493,28492,28491,28490,28489,28488,28487,28486,28483}/ | head -6
/proc/28483/:
total 0
dr-xr-xr-x 2 root root 0 Jan 30 11:18 attr
-rw-r--r-- 1 root root 0 Jan 30 11:18 autogroup
-r-------- 1 root root 0 Jan 30 11:18 auxv

Eu acredito que no primeiro caso, o shell está considerando a saída do backtick como um único argumento, e não está expandindo. Então, eu estou querendo saber, existe uma maneira de fazê-lo ver como uma lista a ser expandida? Eu sei que eu poderia fazer isso com um loop for, ou de muitas outras maneiras. Estou particularmente interessado em aprender mais sobre backticks e apoiar expansões, assumindo que é possível fazê-lo.

    
por msb 30.01.2017 / 20:44

1 resposta

5

A ordem de avaliação em bash é tal que a expansão de contraventamento é feita primeiro, e as substituições de comando não são tratadas até mais tarde.

Veja a ordem em que as coisas são feitas por bash :

  1. expansão de suporte,
  2. expansão de til
  3. parâmetro e expansão variável,
  4. substituição de comando,
  5. expansão aritmética,
  6. divisão de palavras
  7. expansão do nome do caminho.

Solução alternativa:

for pid in $( pidof httpd ); do ls -l /proc/"$pid"; done
    
por 30.01.2017 / 20:49