Linux에서는 다음 CD가 제대로 작동하므로 cd를 tmp로 변환합니다.
/ # cd /tmp
tmp #
그러나 이것은 작동하지 않습니다(루트에 머물며 /var/log/messages에 아무것도 나타나지 않습니다). 왜 안 돼?
/ # cd /tmp 2>&1 | /usr/bin/logger -t Test
/ #
이 stderr 리디렉션을 제거하려고 시도했지만 그것도 작동하지 않았습니다.
내 목표는 스크립트의 모든 출력을 syslog로 리디렉션하는 것입니다. 존재하지 않는/권한이 거부된/등의 디렉터리로 CD를 시도하는 경우에도 마찬가지입니다. 왜 작동하지 않으며 작동하게 만드는 방법은 무엇입니까?
일반 에코는 시스템 로그에 인쇄되므로 작동합니다.
echo Test | /usr/bin/logger -t Test
답변1
파이프라인은 생산자(왼쪽) 프로세스와 소비자(오른쪽) 프로세스를 병렬로 실행합니다. 두 개의 병렬 프로세스가 있으므로 그 중 적어도 하나는 기본 셸 프로세스의 하위 프로세스여야 하며 둘 다 가능해야 합니다.
대부분의 쉘은 하위 프로세스에서 파이프의 양쪽을 실행합니다. ATT ksh 및 zsh는 원래 프로세스의 오른쪽에서 실행됩니다.
이 cd
명령은 현재 쉘 프로세스의 현재 디렉토리를 변경하므로내장되어야 합니다. 파이프의 왼쪽은 서브쉘에서 실행되므로(하위 프로세스는두 갈래로 갈라진스크립트를 실행하는 셸 프로세스에서 시작하면 이 cd
명령은 하위 셸에서만 적용됩니다. 작동하지만 서브쉘이 즉시 종료되므로 유용한 작업을 수행하지 않습니다. 당신은 그것을 관찰할 수 있습니다
{ cd /tmp; echo -n "left-hand side: "; pwd; } |
{ cd /usr; echo -n "right-hand side: "; pwd; }
echo -n "parent: "; pwd
스크립트의 출력을 기록하려면 전체 스크립트에 적용되는 파이프라인을 생성하십시오.
main () {
… # whole script goes here
}
main | logger