.bashrc가 시작 시 별칭에서 하위 명령을 실행하는 것을 방지하는 방법은 무엇입니까? [복사]

.bashrc가 시작 시 별칭에서 하위 명령을 실행하는 것을 방지하는 방법은 무엇입니까? [복사]

guake터미널을 종료하기 위해 별칭 명령을 추가했습니다..bashrc

alias killguake="kill -9 $(ps aux | grep guake | head -n -1 | awk '{print $2}')"

그러나 문제는 하위 명령 ie가 ps aux | grep guake | head -n -1 | awk '{print $2}'터미널이 시작될 때 실행되고 killguake로 설정된다는 것입니다 kill -9 result_of_subcommand.

하위 명령이 실행될 때마다 실행/평가되도록 이를 설정할 수 있는 방법이 있습니까 killguake? 이런 방식으로 guake의 최신 PID를 얻을 수 있습니다.

kill나는 또한pipes를 사용해 보았지만 xargs, 그것은 또한 시작시 모든 것이 계산된다는 동일한 결과로 이어졌습니다. 이것이 파이프를 사용하는 방법입니다.

ps aux | grep guake | head -n -1 | awk '{print $2}' | xargs -I{} kill -9 {}

답변1

대신 사용하십시오 pkill:

alias killguake='pkill guake'

이는 출력의 프로세스 테이블을 구문 분석하는 것보다 훨씬 안전합니다 ps.

그렇다면 이제 별칭이 원하는 대로 작동하지 않는 이유를 설명하겠습니다. 하지만 실제로는사용pkill.

당신의 별칭

alias killguake="kill -9 $(ps aux | grep guake | head -n -1 | awk '{print $2}')"

큰따옴표 안에 있습니다. 이는 쉘이 쉘 초기화 스크립트에서 이 행을 구문 분석할 때 명령 대체( $( ... ))를 수행한다는 것을 의미합니다. 따라서 파일이 실행될 때마다 나중에 종료할 별칭을 제공하는 대신 실행 중인 프로세스를 guake종료할 별칭을 제공합니다.guake지금.

별칭을 나열하면(을 사용하여 alias) 별칭이 다음과 같이 표시됩니다.

killguake='kill -9 91273'

아니면 그냥

killquake='kill -9'

guake쉘이 시작될 때 실행되고 있지 않은 경우 .

이 문제를 해결하기 위해(그러나 실제로는그냥 사용pkill) 작은따옴표를 사용하고 Awk 스크립트에서 이를 이스케이프해야 합니다 $(이제 큰따옴표 사용).

alias killguake='kill -9 $(ps aux | grep guake | head -n -1 | awk "{print \$2}")'

하나일반적으로 이 접근 방식의 문제점은 다른 사용자에게 속한 프로세스를 일치시킨다는 것입니다. 또 다른 이유는 grep guake예상되는 프로세스가 아닌 명령 만 찾을 수 있다는 것입니다 . 또 다른 방법은 프로세스를 찾을 수 없으면 오류가 발생한다는 것입니다. 또 다른 상황은 5개의 외부 유틸리티를 호출하여 그 중 하나의 작업을 수행하는 경우입니다.

답변2

pkill을 사용하세요. 바퀴를 재발명하지 마세요!

alias killguake="pkill -9 guake"

관련 정보