Bash: 명령 인수에 괄호를 허용합니다(예: "우연한 토큰 '(' ") 방지)

Bash: 명령 인수에 괄호를 허용합니다(예: "우연한 토큰 '(' ") 방지)

나는 종종 내가 제공하는 인수에 괄호가 포함된 명령줄 프로그램을 사용합니다. 간단히 말해서 내가 글을 쓴다고 가정해보자.

echo 'bar(1,3)'

따옴표를 생략하고 싶습니다. 그러나 이렇게 하면 syntax errror near unexpected token '('서브쉘과 관련이 있는 것 같습니다. 그것이 유일한 방법이라면 기꺼이 비활성화하겠습니다. (명령 시작 부분이 아닌 경우 하위 쉘을 시작할 수 없지만 내가 아는 한 인수에서 괄호를 허용하지 않을 이유가 없습니다.)

답변1

(다음을 포함하여 많은 연산자에 사용되는 )구문의 특수 표시 문자입니다 .bash

  • (...)서브쉘 구조
  • func() compound-command기능 정의
  • $(...)명령 대체
  • <(...), >(...)프로세스 대체
  • ((...))산술 평가 구조
  • $((...))산술 확장
  • a=(...), a+=(...)배열 할당 연산자
  • @(...), +(...), *(...), ?(...)glob 연산자(extglob 사용)
  • [[ (a && b) || (c && d) ]]그룹 조건식 연산자
  • [[ ... =~ ...(...)... ]]정규식 연산자.

echo a=(b)문법 오류이지만 그렇지 않습니다 export a=(b).

echo a)(위 구문 중 하나의 처음 몇 줄에 공백이 없으면 구문 오류입니다.

(구문 오류를 피하기 위해 필요한 곳에 따옴표를 추가하는 readline 후크를 작성하는 것이 가능하지만 )이는 쉘 구문의 완전한 구문 분석을 의미하므로 상당한 노력이 필요합니다.

현재 단어에 쉘 특정 문자가 포함되어 있다는 사실을 너무 늦게 깨달은 경우 현재 단어를 참조하는 단축키를 사용하는 것이 더 나은 접근 방식일 수 있습니다.

AND zsh( emacs패턴 가정):

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

Alt+#현재를 참조하십시오단어.

또는 대략적으로 bash(모드를 가정하여 emacs):

bind "\"\e#\": \"'\e \eb'\C-X\C-X\""

답변2

이것은 아마도 나쁜 생각일 것입니다(주석 참조). 그러나 동일한 문제가 있었고 사용하기 전에 합계 [로 변경되는 함수를 만들어 해결했습니다 .(])

echo2() {
    expression=$(echo $@ | tr '[]' '()')
    echo "$expression"
}

입력하다:

echo2 bar[1,3]

결과:

bar(1,3)

[와 가 ]쉘에 의해 특별히 처리되는지 는 모르겠습니다 . 그러나 (기능 대신 이를 사용하려는 경우 )아마도 이것이 솔루션일 수 있습니다.

관련 정보