Bash: разрешить круглые скобки в аргументах команды (т.е. предотвратить «неожиданный токен» (‘”)

Я часто использую программу командной строки, которую я предоставляю с аргументами, содержащими скобки. Для простоты, скажем, я пишу

echo 'bar(1,3)'

Я хотел бы опустить цитаты. Однако, если я это сделаю, я получу syntax errror near unexpected token '(' . Я думаю, это связано с подshellми. Я хочу отключить их, если это единственный способ. (Хотя подshell не может быть запущена, если она не находится в начало команды в любом случае, поэтому они не являются основанием для запрета скобок в аргументах, насколько я могу судить)

    One Solution collect form web for “Bash: разрешить круглые скобки в аргументах команды (т.е. предотвратить «неожиданный токен» (‘”)”

    ( и ) являются специальными символами-токенами в синтаксисе bash , которые используются в ряде операторов, включая:

    • (...) подshell
    • func() compound-command
    • $(...) подстановка команд
    • < (...) , >(...) процесс подстановки
    • ((...)) конструкция арифметической оценки
    • $((...)) арифметическое разложение
    • a=(...) , a+=(...) операторы присваивания массива
    • операторы @(...) , +(...) , *(...) ,? ?(...) (с extglob)
    • [[ (a && b) || (c && d) ]] [[ (a && b) || (c && d) ]] группировка операторов условных выражений
    • [[ ... =~ ...(...)... ]] оператор регулярного выражения.

    echo a=(b) - синтаксическая ошибка, но не export a=(b) .

    echo a) является синтаксической ошибкой, если не было открытия ( в предыдущих строках часть одной из конструкций выше).

    Хотя может быть возможным написать ловушку readline, которая добавляет кавычки, где это необходимо, вокруг ( , ) чтобы избежать синтаксической ошибки, это будет значительным усилием, поскольку это будет означать полный синтаксический анализ синтаксиса оболочки.

    Лучшим подходом может быть использование ярлыка, который цитирует текущее слово, когда вы слишком поздно понимаете, что оно содержит специальные символы для оболочки.

    С zsh (в режиме emacs ):

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

    Чтобы Alt + # цитировал текущее слово .

    Или приближение с помощью bash (также в предположении режима emacs ):

     bind "\"\e#\": \"'\e \eb'\CX\CX\"" 
    Linux и Unix - лучшая ОС в мире.