Problemas ao configurar uma variável para uma string contendo metacaracteres, find e outra variável em csh

1

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.

    
por enegence 11.02.2018 / 19:44

1 resposta

0

Eu não acho que você pode colocar um | em uma variável e tê-lo interpretado como iniciar um pipeline depois que a variável for expandida sem eval .

Então, o que você poderia fazer, seria colocar os argumentos find em uma variável e o comando awk em outro:

Isso parece funcionar para mim (no tcsh):

> mkdir dir; touch dir/file
> set findopts = '-type f'
> set awkcmd = '{gsub(/.\//,"")}1'
> find . $findopts | awk "$awkcmd" 
difile

No entanto, ./ corresponde a qualquer caractere seguido por uma barra, então talvez você quisesse escapar do ponto também:

> set awkcmd = '{gsub(/\.\//,"")}1'
> find . $findopts | awk "$awkcmd"
dir/file

Ou com eval , se você insistir:

> set cmd = 'find . -type f | awk '\''{gsub(/\.\//,"" ) }1'\'
> eval "$cmd"
dir/file

Francamente, eu não sei sobre as sutilezas de citação do csh (e não tenho interesse em descobrir). O acima parece funcionar de forma semelhante a shells do tipo POSIX, mas verifique você mesmo.

    
por 11.02.2018 / 21:54