ps –ax | grep $$ > catch
효과 는 무엇입니까 ? 이 줄의 기능이 무엇인지 알고 싶습니다. 코드를 실행하면 출력에 아무 것도 추가되지 않습니다.
답변1
이 명령은 ps -ax
귀하의 프로세스와 다른 사용자의 프로세스를 표시합니다.
grep
정규식과 일치하는 행을 일치시킵니다. 이 경우 정규식은 이며 $$
, 셸은 현재 셸의 프로세스 ID로 확장됩니다.
오른쪽 꺾쇠 괄호( >
)는 출력을 이름이 지정된 파일로 리디렉션합니다 catch
. 파일이 있으면 먼저 잘리고(비워지고) 그렇지 않으면 파일이 생성됩니다.
답변2
이는 좋은 방법이 아닙니다. ps에게 다음을 표시하도록 요청했습니다.
- 모든 프로세스(기본값)
- 플러스 - tty가 있는 다른 모든 프로세스(옵션)
- 플러스 - tty가 없는 다른 모든 프로세스(x 옵션)
grep
그런 다음 - 1단계의 단일 프로세스를 사용하여 필터링합니다.
간단한 일이 ps -h $$ > catch
가능합니다. ps
관심 있는 프로세스의 PID를 명령줄 옵션으로 가져오므로 원하는 것이 무엇인지 알고 있다면 grep이 작동하기를 바라지 말고 직접 지정하십시오. 옵션 -h
은 머리글 행을 제거하는 것입니다.
그러나 스크립트에서 $$는 "이 쉘"을 의미하므로 매우 주의해야 합니다.이것통화 시간과 장소에 따라 다릅니다.
다음 두 명령을 고려하십시오.
$ sh -c "ps -ax | grep $$"
3802 pts/0 Ss 0:11 bash
3658110 pts/0 S+ 0:00 sh -c ps -ax | grep 3802
3658112 pts/0 S+ 0:00 grep 3802
$ sh -c 'ps -ax | grep $$'
3658142 pts/0 S+ 0:00 sh -c ps -ax | grep $$
3658144 pts/0 S+ 0:00 grep 3658142
스크립트는 항상 이런 종류의 일을 합니다. 첫 번째 줄은 3줄인데 두 번째 줄은 2줄만 있나요? 그 이유는 첫 번째 문제는 우리가 해결하고 $$
스크립트를 실행하여 "기본" 셸을 찾아내지만 두 번째 문제는 다른 방식으로 수행하고 있기 때문입니다. 물론 하위 셸에 대해 다른 PID가 있고 일치하지 않기 때문입니다. 3802 부모.
어느 것이 맞나요? 그것은 당신이하고 싶은 일에 달려 있습니다. 메인 셸을 찾는 경우 일반적으로 먼저 변수로 설정하므로 그것이 내가 원하는 것이 분명합니다.