Bash: Permitir parênteses em argumentos de comando (por exemplo, impedir “token inesperado” ('”)

2

Eu estou freqüentemente usando um programa de linha de comando que eu forneço com argumentos que contêm parênteses. Para simplificar, digamos que eu esteja escrevendo

echo 'bar(1,3)'

Eu gostaria de omitir as citações. No entanto, se eu fizer isso, receberei syntax errror near unexpected token '(' . Eu acho que isso está relacionado a subshells. Estou disposto a desativá-los, se esse for o único caminho. (embora um subshell não possa ser iniciado se não estiver no início do comando, então eles não são motivo para proibir parênteses nos argumentos, até onde eu saiba)

    
por Bananach 24.08.2018 / 14:03

1 resposta

4

( e ) são caracteres de token especiais na sintaxe de bash que são usados em vários operadores, incluindo:

  • (...) subshell construct
  • func() compound-command definições de funções
  • $(...) substituição de comando
  • <(...) , >(...) substituição de processo
  • ((...)) construção de avaliação aritmética
  • $((...)) expansão aritmética
  • a=(...) , a+=(...) operadores de atribuição de matriz
  • @(...) , +(...) , *(...) , ?(...) glob operadores (com extglob)
  • [[ (a && b) || (c && d) ]] agrupando operadores de expressão condicional
  • [[ ... =~ ...(...)... ]] operador regexp.

echo a=(b) é um erro de sintaxe, mas não export a=(b) .

echo a) é um erro de sintaxe, a menos que tenha havido uma abertura ( nas linhas anteriores parte de uma das construções acima.

Embora seja possível escrever um gancho readline que adicione aspas onde necessário em torno de ( , ) para evitar um erro de sintaxe, seria um esforço considerável, pois significaria fazer uma análise completa da sintaxe do shell.

Uma abordagem melhor pode ser usar um atalho que cite a palavra atual quando você percebe tarde demais que contém caracteres especiais para o shell.

Com zsh (assumindo o modo emacs ):

bindkey -s '\e#' '\C@\eb\Cx\Cx\e"'

Para que Alt + # apresente a palavra .

Ou uma aproximação com bash (também assumindo emacs mode):

bind "\"\e#\": \"'\e \eb'\C-X\C-X\""
    
por 24.08.2018 / 14:37

Tags