나는 배쉬를 사용하고 있습니다. 단 한 줄만 포함하는 "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
대신 zsh
or 를 사용하면 오류를 이해할 수 있습니다.(t)csh
bash
$ ps -ef | grep [c]ron
zsh: no matches found: [c]ron
위에는 패턴과 일치하는 현재 디렉터리의 파일 목록으로 확장하도록 설계된 와일드카드 패턴이 있습니다.
그러나 대부분의 Bourne 및 rc 유사 쉘에서는 일치하는 파일이 없으면 패턴이 변경되지 않고 자동으로 명령에 전달됩니다.
그렇기 때문에 현재 디렉터리에 호출된 파일이 없기 때문에 작동 [c]ron
하지만 현재 디렉터리에 패턴과 일치하는 파일이 있기 때문에 작동하지 않고 쉘에 의해 확장되고 대신 인수를 가져옵니다.cron
[a]2draw
a2draw
grep
a2draw
[a]2draw
이 경우 bash
다음을 수행하여 이와 같이 작동하도록 구성할 수 있습니다 .zsh
shopt -s failglob
fish
쉘은 또한 glob이 일치하지 않을 때 오류를 보고합니다. 그러나 [...]
와일드카드 연산자는 아닙니다 fish
.
즉, 와일드카드를 확장하지 않으려면 이를 인용해야 합니다.
ps -ef | grep '[a]2draw'
bash
Bourne's 이외의 Bourne과 유사한 셸에서 이 작업을 수행 하지 않고도 이 작업을 수행할 수 있지만 zsh
이렇게 하면 일치하는 파일이 있는 디렉터리에서 명령을 실행할 때마다 숨어 있는 버그가 발생할 수 있습니다.
예상치 못한 상황에서 원치 않는 부작용이 발생할 수 있습니다. 좋다:
rm -?
및 이름의 파일 이 포함된 디렉토리에서 --
및 모두 삭제 -x
됩니다 .-y
-x
-y