추신 | grep은 서브셸에서 잘못된 출력을 표시하고 작업은 백그라운드에서 실행됩니다.

추신 | grep은 서브셸에서 잘못된 출력을 표시하고 작업은 백그라운드에서 실행됩니다.

나는 배쉬를 사용하고 있습니다. 단 한 줄만 포함하는 "a2draw"라는 파일이 있습니다.

sleep 99999

다음 명령을 사용하여 시작합니다.

bash a2draw &

이제 나는 ps 출력에서 ​​grep 프로세스를 생략할 수 있는 대괄호 트릭을 알고 이해합니다.

ps aux | grep cron
root      1079  0.0  0.0   2596   788 ?        Ss   Mar25   0:00 cron
root      1119  0.0  0.0   3684   696 ?        Ss   Mar25   0:00 /usr/sbin/incrond -f /etc/incron.conf
ja       29781  0.0  0.0   4368   820 pts/10   S+   12:49   0:00 grep cron

ps aux | grep [c]ron
root      1079  0.0  0.0   2596   788 ?        Ss   Mar25   0:00 cron
root      1119  0.0  0.0   3684   696 ?        Ss   Mar25   0:00 /usr/sbin/incrond -f /etc/incron.conf

그러나 백그라운드에서 작업을 실행하는 하위 쉘에서는 작동하지 않습니다.

jobs
[1]+  Running                 bash a2draw &

ps aux | grep [a]2draw
ja       22977  0.0  0.0   5172  1080 pts/10   S    12:21   0:00 bash a2draw
ja       30242  0.0  0.0   4364   816 pts/10   R+   12:50   0:00 grep

낯선 사람이라도 프로세스 이름에서 문자를 제거하면 올바른 결과가 나옵니다.

ps aux | grep [a]2dra
ja       22977  0.0  0.0   5172  1080 pts/10   S    12:21   0:00 bash a2draw

다른 셸에서는 모든 것이 예상대로 작동합니다.

ps aux | grep [a]2draw
ja       22977  0.0  0.0   5172  1080 pts/10   S    12:21   0:00 bash a2draw

ps aux | grep [a]2dra
ja       22977  0.0  0.0   5172  1080 pts/10   S    12:21   0:00 bash a2draw

무슨 일이 일어났는지 모르겠어요. 파이프라인 생성 방법을 수정하는 백그라운드 작업에 특별한 것이 있나요?

답변1

대신 zshor 를 사용하면 오류를 이해할 수 있습니다.(t)cshbash

$ ps -ef | grep [c]ron
zsh: no matches found: [c]ron

위에는 패턴과 일치하는 현재 디렉터리의 파일 목록으로 확장하도록 설계된 와일드카드 패턴이 있습니다.

그러나 대부분의 Bourne 및 rc 유사 쉘에서는 일치하는 파일이 없으면 패턴이 변경되지 않고 자동으로 명령에 전달됩니다.

그렇기 때문에 현재 디렉터리에 호출된 파일이 없기 때문에 작동 [c]ron하지만 현재 디렉터리에 패턴과 일치하는 파일이 있기 때문에 작동하지 않고 쉘에 의해 확장되고 대신 인수를 가져옵니다.cron[a]2drawa2drawgrepa2draw[a]2draw

이 경우 bash다음을 수행하여 이와 같이 작동하도록 구성할 수 있습니다 .zsh

shopt -s failglob

fish쉘은 또한 glob이 일치하지 않을 때 오류를 보고합니다. 그러나 [...]와일드카드 연산자는 아닙니다 fish.

즉, 와일드카드를 확장하지 않으려면 이를 인용해야 합니다.

ps -ef | grep '[a]2draw'

bashBourne's 이외의 Bourne과 유사한 셸에서 이 작업을 수행 하지 않고도 이 작업을 수행할 수 있지만 zsh이렇게 하면 일치하는 파일이 있는 디렉터리에서 명령을 실행할 때마다 숨어 있는 버그가 발생할 수 있습니다.

예상치 못한 상황에서 원치 않는 부작용이 발생할 수 있습니다. 좋다:

rm -?

및 이름의 파일 이 포함된 디렉토리에서 --및 모두 삭제 -x됩니다 .-y-x-y

관련 정보