별칭이 지정되면 내 명령이 작동하지 않는 이유는 무엇입니까?

별칭이 지정되면 내 명령이 작동하지 않는 이유는 무엇입니까?

ps -ef | grep catalina | grep -v grep시스템에서 실행 중인 Tomcat 프로세스를 인쇄하는 데 사용합니다 .

kshitiz   7099     1  0 May11 ?        00:02:29 /usr/lib/jvm/jdk1.8.0/bin/java -agentlib:jdwp=transport=dt_socket,suspend=y,address=localhost:38156 -Dcatalina.base=/home/kshitiz/Documents/workspaces/ggts/.metadata/.plugins/org.eclipse.wst.server.core/tmp1 -Dcatalina.home=/opt/tomcat-7.0.42 -Dwtp.deploy=/home/kshitiz/Documents/workspaces/ggts/.metadata/.plugins/org.eclipse.wst.server.core/tmp1/wtpwebapps -Djava.endorsed.dirs=/opt/tomcat-7.0.42/endorsed -Dfile.encoding=UTF-8 -classpath /opt/tomcat-7.0.42/bin/bootstrap.jar:/opt/tomcat-7.0.42/bin/tomcat-juli.jar:/usr/lib/jvm/jdk1.8.0/lib/tools.jar org.apache.catalina.startup.Bootstrap start

ps -ef | grep catalina | grep -v grep | awk -F' ' '{print $2}'그런 다음 프로세스 ID를 추출하는 데 사용합니다 .

7099

그러나 전체 명령에 별칭을 지정 alias tomcat_id="ps -ef | grep catalina | grep -v grep | awk -F' ' '{print $2}'"하고 별칭을 통해 사용하면 전체 텍스트가 인쇄되고 awk작동하지 않는 것 같습니다.

type tomcat_id다음을 제공합니다:

tomcat_id is aliased to `ps -ef | grep catalina | grep -v grep | awk -F' ' '{print }''

답변1

별칭의 일반 규칙: 별칭에 비해 너무 복잡해지면 대신 함수를 사용하세요.

tomcat_id () {
  ps -ef | grep catalina | grep -v grep | awk -F' ' '{print $2}'
}

별칭 정의의 문제는 인용이 잘못되었다는 것입니다. 별칭을 정의하는 행은 셸 명령이며 셸에서 구문 분석됩니다. 큰따옴표를 사용했고 당시에는 위치 매개변수가 없었을 것이므로( $2빈 문자열로 확장됨) 정의한 별칭은 다음과 같습니다.

ps -ef | grep catalina | grep -v grep | awk -F' ' '{print }'

별칭을 정의하는 쉬운 방법은 정의에 작은따옴표를 사용하고 별칭이 지정된 명령에서는 작은따옴표를 사용하지 않는 것입니다. 그 동안 어쨌든 기본값인 를 제거했습니다 -F " "(그리고 "공백"처럼 보이지만 "공백의 연속"을 의미하기 때문에 약간 이상합니다).

alias tomcat_id='ps -ef | grep catalina | grep -v grep | awk "{print \$2}"'

'\''또는 작은따옴표 리터럴 내에서 작은따옴표를 효과적으로 인용하는 데 사용할 수 있습니다 .

alias tomcat_id='ps -ef | grep catalina | grep -v grep | awk '\''{print \$2}'\'

하지만 위에서 쓴 것처럼 함수를 사용하면 더 명확해집니다. 또는 작업에 적합한 도구를 사용하십시오.

alias tomcat_id='pgrep catalina'

또는

alias tomcat_id='pidof catalina'

답변2

Gnouc의 답변은 완벽하게 유효하지만(그래서 제가 추천한 이유입니다) 대안을 제시하고 싶습니다.

alias tomcat_id="ps -ef|awk '\$8 ~ /java/ && /catalina/ {print \$2}'"

여기서 아이디어는 프로세스 이름(필드 8)에서 를 찾을 수 있어야 java하고 줄 전체에서 를 찾아야 한다는 것입니다 catalina.

그래서 우리는 awk매칭과 인쇄 작업을 모두 하게 됩니다. 귀찮게 할 필요가 없습니다 grep;)

따라서 의미는 다음과 같습니다.

$8 ~ /java/ && /catalina/ {print $2}

$8정규식과 필드를 일치시키고 정규식 /java/과 전체 줄을 일치시키고( $0명시적으로 사용할 수도 있음) /catalina/이러한 사항이 true이면 print field 입니다 $2. Gnouc의 답변에 이미 언급된 내용을 기억하십시오. 기본 구분 기호는 이미 공백입니다. 이것을 정의할 필요가 없습니다.

답변3

awk명령 에서 달러 기호를 이스케이프해야 합니다 .

alias tomcat_id="ps -ef | grep catalina | grep -v grep | awk '{print \$2}'"

-F' '을 사용할 필요가 없으며 awk공백을 기본 필드로 별도로 사용하십시오.

관련 정보