Eu não estou familiarizado com a sintaxe do qmake, mas a partir de sua amostra usa citações e variáveis de maneiras muito diferentes das shells. Então você não pode simplesmente usar o mesmo código.
link abrange o que você precisa saber, então aqui vou resumir o que é relevante para sua pergunta.
Em suma, você não pode simplesmente colocar um comando shell em uma string. Shells como bash não analisam strings recursivamente. Eles analisam o código-fonte e criam comandos como lista de strings: um comando simples consiste em um nome de comando (caminho para um executável, nome da função, etc.) e seus argumentos.
Quando você usa uma atribuição como AWK="awk '{\=substr(\,3);printf}'"
, isso define a variável AWK
como uma string; quando você usa a variável como $AWK
fora de aspas duplas, isso transforma o valor da variável em uma lista de strings, analisando-a no espaço em branco, mas não a analisa como código shell, então caracteres como '
acabam sendo literalmente no argumento. Isso raramente é desejável, e é por isso que o conselho geral sobre o uso de variáveis no shell é colocar aspas duplas em torno de expansões de variáveis a menos que você saiba que precisa deixá-las fora e entender o que isso implica. (Note que a minha resposta aqui não conta toda a história).
No bash, você pode colocar um comando simples em uma matriz.
#!/bin/bash
FIND=(find -name '*.pro' -printf '%h\n')
AWK=(awk '{$1=substr($1,3);print}')
SUBDIRS=$("${FIND[@]}" | "${AWK[@]}")
Mas geralmente a melhor maneira de armazenar um comando é definir uma função. Isto não se limita a um simples comando: desta forma você pode ter redirecionamentos, atribuições de variáveis, condicionais, etc.
#!/bin/bash
find_pro_files () {
find -name '*.pro' -printf '%h\n'
}
truncate_names () {
awk '{$1=substr($1,3);print}'
}
SUBDIRS=$(find_pro_files | truncate_names)
Não sei ao certo o que você está tentando fazer com esse script (especialmente considerando que você altera o código find
e awk
entre os snippets de código), mas provavelmente há uma maneira melhor de fazer isso. Você pode fazer loop sobre *.pro
arquivos em subdiretórios do diretório atual com
for pro in */*.pro; do
subdir="${pro%/*}"
basename="${pro##*/}"
…
done
Se você quiser percorrer subdiretórios recursivamente, no bash, você pode usar **/*.pro
em vez de */*.pro
, mas tenha cuidado com isso também recorre a links simbólicos para diretórios.