Estou usando o csh para um projeto (forçado, desculpe) e um componente do meu script usa variações dos seguintes itens em um grande bloco de funcionalidade:
find . -maxdepth 1 -not -type d | awk '{gsub(/.\//,"")}1' | grep $userID
Isso funciona como planejado no meu script, mas eu preciso ter esse conjunto em uma variável para que eu possa alterar minha expressão e os resultados do grep (ter uma instrução switch grande que modifique essa string). Eu tentei uma série de coisas, mas não consigo fazer isso funcionar. Então, não só estou usando CSH, também estou carregando comandos em variáveis (também não, não, novamente, desculpe), mas para este caso muito específico eu gostaria de tentar fazer isso funcionar, se possível. Eu sinto que é apenas um problema de citação / formatação, caso contrário eu abandonaria completamente isso.
Veja o que eu fiz:
Aspas duplas:
set findString = "find . -maxdepth 1 -not -type d | awk '{gsub(/.\//,"")}1' | grep $userID"
Esse eco está de volta, mas quando o find é executado, recebo o seguinte erro:
find: os caminhos devem preceder a expressão: |
Eu percebo que o shell tentará expandi-lo antes de executar o comando, mas não sei exatamente como passar por isso (não consigo citar isso para que funcione corretamente). Eu tentei colocá-lo entre aspas das seguintes maneiras:
set findString = "find . -maxdepth 1 -not -type d \"|\" awk '{gsub(/.\//,"")}1' | grep $userID"
set findString = "find . -maxdepth 1 -not -type d \"| awk '{gsub(/.\//,"")}1' | grep $userID\""
set findString = "find \". -maxdepth 1 -not -type d | awk '{gsub(/.\//,"")}1' | grep $userID\""
set findString = "\"find . -maxdepth 1 -not -type d | awk '{gsub(/.\//,"")}1 | grep $userID'\""
E recebi o seguinte em cada:
incomparável ".
Então eu tentei aspas simples, mas parece que não consigo fazer isso até ecoar de volta:
set findString = 'find . -maxdepth 1 -not -type d | awk \'{gsub(/.\//,"")}1\' | grep $userID'
echo $findString
Novamente: incomparável '.
Neste ponto, tentei novamente usar as aspas duplas, mas escapei de todos os caracteres Msh do csh:
set findString = "find\ .\ \-maxdepth\ 1\ \-not\ \-type\ d\ \|\ awk\ \'\{gsub(/.\//,\"\"\)}1\'\ \|\ grep\ \$userID"
Não. Então, encontrei outro tópico que referenciou este documento útil sobre citações, e tentei implementá-lo de maneira diferente. Acabei pegando find
da variável e apenas carregando o resto da string na variável como opções de busca. Eu também retirei o grep
pipe para tentar me concentrar nisto. Parecia:
set findString = ( \( -maxdepth 1 -not -type d | awk '{gsub(/.\//,"")}1' \) )
echo $findString
find . "${findString}"
Embora o find
seja executado, ele não é avaliado corretamente. Eu sinto que deve haver uma maneira de fazer isso.
Estou preso. Eu gostaria de receber qualquer ajuda sobre isso e, mais uma vez, pedir desculpas por cometer uma dupla atrocidade com o CSH e carregar essa string de comando para um var.