별칭 또는 bash 기능이 작동하지 않습니다

별칭 또는 bash 기능이 작동하지 않습니다

내가 만들 때

alias wd='ps -ef | grep java | awk {'print $2 " " $9'} | egrep "(A|B|C|D)"'

또는

function wd () {
    ps -ef | grep java | awk '{print $2}' ...
}

.bashrc 파일에 오류가 발생합니다. 흥미롭게도 이 함수를 사용하여 .bashrc 파일을 가져오면 "컴파일"되지만 실행되면 다음과 같은 결과가 나타납니다.

 context is
     >>> \ <<< {\print
    missing }

별칭보다 함수에 무언가를 넣는 것이 언제 더 나은지 누군가가 이것을 파악하고 대답하도록 도와줄 수 있습니까?

답변1

별칭이 작동하지 않는 이유

alias wd='ps -ef | grep java | awk {'print $2 " " $9'} | egrep "(A|B|C|D)"'

alias명령은 세 가지 매개변수를 받습니다. 첫 번째는 문자열입니다 wd=ps -ef | grep java | awk {print. 작은 따옴표는 그 사이의 문자가 특별한 의미를 갖지 않도록 합니다. 두 번째 매개변수는 단일 공백 ​​문자로 구성됩니다. ( 에서는 .bashrc위치 인수 $2$9가 비어 있으므로 $20 단어 목록으로 확장됩니다.) 세 번째 인수는 } | egrep "(A|B|C|D)"(역시 작은따옴표로 특수 문자를 보호합니다)입니다.

별칭 정의가 발견되면 다른 쉘 명령처럼 구문 분석됩니다. 별칭에 대해 정의된 문자열은 별칭이 확장될 때 구문 분석됩니다. 이 별칭을 정의하는 몇 가지 가능한 방법은 다음과 같습니다. 첫 번째 가능성: 전체 별칭 정의가 작은따옴표 안에 있으므로 명령에는 큰따옴표만 사용됩니다. 이는 awk "와 백슬래시를 사용하여 보호해야 함을 의미합니다.$

alias wd='ps -ef | grep java | awk "{print \$2 \" \" \$9}" | egrep "(A|B|C|D)"'

두 번째 가능성: 각 문자는 리터럴 문자열을 끝내는 작은따옴표를 제외하고 작은따옴표 안에 자신을 나타냅니다. '\''"작은 따옴표 안의 작은 따옴표"에 대한 관용어입니다. 작은 따옴표로 묶인 문자열을 끝내고 리터럴 작은 따옴표를 넣은 다음 즉시 새로운 작은 따옴표로 묶인 문자열을 시작합니다. 사이에 공백이 없기 때문에 여전히 같은 단어입니다.

alias wd='ps -ef | grep java | awk '\''{print $2 " " $9}'\'' | egrep "(A|B|C|D)"'

조금 단순화할 수 있습니다.

alias wd='ps -ef | grep java | awk '\''{print $2, $9}'\'' | egrep "(A|B|C|D)"'

팁: set -x쉘이 명령을 확장하는 방법을 확인하는 데 사용됩니다.

기능이 작동하지 않는 이유

나는 모른다. 보여주신 부분은 괜찮은 것 같습니다. 설명을 설명한 후에도 함수가 작동하지 않는 이유를 여전히 이해하지 못한다면 코드를 복사하여 붙여넣으세요.

별칭이나 기능?

일반적으로 일반적으로 사용되는 명령에 대해 더 짧은 이름을 제공하거나 기본 옵션을 제공하기 위해 매우 간단한 경우에만 별칭을 사용하십시오. 예:

alias grep='grep --color'
alias cp='cp -i'
alias j=jobs

더 복잡한 작업에는 함수를 사용하세요.

너는 무엇을 써야 할까?

출력을 구문 분석하지 말고 대신 ps자신에게 적합한 출력을 생성하도록 하십시오.

wd () {
  ps -C java -o pid=,cmd= | egrep "(A|B|C|D)"
}

답변2

별칭의 문제점은 따옴표를 직접 중첩할 수 없다는 것입니다(특별한 경우인 내부 제외 $()). 내면의 경계에서 벗어나야 합니다.

alias wd='ps -ef | grep java | awk {\'print $2 " " $9\'} | egrep "(A|B|C|D)"'
#                                   ^^               ^^

제가 정확히 지적할 수 없는 너무 많은 함수 형식을 제거했지만 오류 조각이 awk인용 또는 쉘 변수 확장 문제에서 발생하고 제안합니다.

일반적으로 함수는 별칭보다 더 유연하지만(기록 확장 이외의 별칭을 사용한 인수 처리를 제어할 수 없음) 별칭은 더 빠르며 별칭을 공백으로 끝내면 첫 번째 인수가 명령( 테이블 완성 등) 별칭은 선언된 파일 내에서도 아무런 영향을 미치지 않습니다(무한 별칭 확장 루프를 피하기 위해).

답변3

별칭에 매개변수를 전달할 수 없다고 생각합니다. 별칭은 명령의 첫 번째 단어에 대한 문자열 대체 규칙입니다.
예:

alias wd='ps -ef | grep java | awk {'print $2 " " $9'} | egrep "(A|B|C|D)"'

명령이 wd arg1 arg2 arg3다음과 같이 대체되고 실행됩니다.

ps -ef | grep java | awk {'print " " '} | egrep "(A|B|C|D)" arg1 arg2 arg3

그 밖의 모든 것에는 함수를 사용하십시오.

관련 정보