bash: 예상치 못한 토큰 "foo" 근처에 구문 오류가 있습니다.

bash: 예상치 못한 토큰 "foo" 근처에 구문 오류가 있습니다.

단순화를 위해 별칭을 사용하여 명령을 지정해 보았습니다.

php artisan route:list | (head -n 3; grep checkout)

이 명령은 테이블의 제목을 표시하고 경로를 검색합니다. 결과는 다음과 같습니다.

+--------+----------+--------------------------------------------+----------------------------------------------------+-------------------------------------------------------------------------------+------------------------------------------------------+
| Domain | Method   | URI                                        | Name                                               | Action                                                                        | Middleware                                           |
+--------+----------+---------------------------------------------+----------------------------------------------------+-------------------------------------------------------------------------------+------------------------------------------------------+
|        | POST     | profile/auctions/checkout                  | user-portal-profile-auctions-checkout              | xxxxxxxxxxxxxxxx                   | web,auth                                             |
|        | POST     | profile/deals/checkout                     | user-portal-profile-deals-checkout                 | xxxxxxxxxxxxxx                     | web,auth                                             |
|        | POST     | profile/quotes/checkout                    | user-portal-profile-quotes-checkout                | xxxxxxxxxxxxxxx                    | web,auth                                             |

이것이 내가 가진 것입니다 ~/.bash_profile:

alias findRoute='php artisan route:list | (head -n 3; grep $1)'

하지만 계속해서 다음 오류가 발생합니다.

bash: syntax error near unexpected token `checkout'

무엇을 제공합니까? 왜 내 주장을 받아들이지 않는 걸까요?

전달하는 매개변수에 작은따옴표와 큰따옴표를 사용해 보았습니다.

별칭에 작은따옴표와 큰따옴표를 사용해 보았습니다. 아무것도 변하지 않습니다.

답변1

별칭 확장은 단지 텍스트 교체와 쉘에 의한 또 다른 구문 분석 라운드입니다.

당신이 들어갈 때

findRoute checkout

먼저 다음으로 확장하세요.

php artisan route:list | (head -n 3; grep $1) checkout

결과는 다시 쉘 코드로 구문 분석됩니다. 여기의 쉘 코드가 유효하지 않습니다.

여기서 스크립트나 함수를 사용할 수 있습니다. 좋다:

findRoute() {
  php artisan route:list | {
    head -n 3
    grep -e "$1"
  }
}

대부분의 구현은 전체 블록을 읽기 head때문에 3줄만 출력하더라도 3줄 이상을 읽을 수 있다는 점에 유의하세요 . head즉, grep부분이 보이지 않습니다.

sedGNU 구현이 있는 경우 head -n3this 로 대체할 수 있습니다 sed -u 3q. sed여기서 입력은 한 번에 1바이트씩 읽혀 세 번째 개행 문자를 지나 읽는 것을 방지합니다.

또는 다음을 사용할 수 있습니다 awk.

findRoute() {
  php artisan route:list |
    PATTERN=$1 awk 'NR <= 3 || $0 ~ ENVIRON["PATTERN"]'
}

조심하다(Beware) $1는 다음과 같이 해석됩니다.확장하다grep -E대신 정규 표현식(예: for )기초적인하나(있나요 grep? -E) 하위 문자열 검색(예 grep -F: )의 경우 다음으로 바꾸세요.

findRoute() {
  php artisan route:list |
    PATTERN=$1 awk 'NR <= 3 || index($0, ENVIRON["PATTERN"])'
}

관련 정보