smbstatus
명령줄에서 실행하면 다음과 같은 결과가 나타납니다.
❯ smbstatus
Samba version 4.17.3
PID Username Group Machine Protocol Version Encryption Signing
----------------------------------------------------------------------------------------------------------------------------------------
Service pid Machine Connected at Encryption Signing
---------------------------------------------------------------------------------------------
No locked files
그러나 다음과 같은 스크립트에 동일한 유형의 명령을 넣으면 다음과 같습니다.
#!/usr/bin/bash
SMB_STATUS="$(smbstatus)"
echo "Result: $SMB_STATUS"
다음 메시지가 나타납니다.
No locked files
Result:
Samba version 4.17.3
PID Username Group Machine Protocol Version Encryption Signing
----------------------------------------------------------------------------------------------------------------------------------------
Service pid Machine Connected at Encryption Signing
---------------------------------------------------------------------------------------------
실제로 "잠금 파일 없음" 행을 필터링하려고 하는데, 백그라운드에서 두 개의 프로세스가 실행 중인 것처럼 보이기 때문에 쉘 스크립트에서는 이를 수행할 수 없는 것 같습니다. 나는 모른다. 내가 여기서 보고 있는 것을 어떻게 설명해야 할지 모르겠습니다.
답변1
이런 이상한 동작을 볼 때 가장 먼저 생각한 것은 그것이 별도의 출력 스트림이라는 것입니다. stderr 및 stdout 중 하나를 제거하여 이를 확인할 수 있습니다.
smbstatus > /dev/null
그리고
smbstatus 2> /dev/null
나는 당신이 차이점을 본 것 같다: smbstatus
print session id("PID username group...")(원천) 및 연결("서비스 pid 머신...")(원천) 도착하다표준 출력"잠긴 파일" 텍스트가 인쇄될 때표준 에러(원천). "파일 잠금" 텍스트가 stdout에서 stderr로 변경되었습니다.이번에 제출하세요2022년 8월 8일 samba-4.17.0rc1.
보내는 프로그램이 버퍼를 플러시하거나 파일 핸들을 닫는 경우를 제외하고 화면(또는 쉘을 통해 캡처된 출력 $( ... )
)이 stdout을 먼저 보는지 또는 stderr을 먼저 보는지는 임의적입니다. 이는 smbstatus가 수행하는 것을 본 적이 없습니다.
"잠금 파일 없음" 줄이 있는지 필터링하려면 다음 방법을 사용하는 것이 좋습니다.표준 오류 스트림(stderr)을 어떻게 grep합니까?:
# in shells that support process substitution such as bash, zsh, or ksh93u+
if smbstatus > /dev/null 2>(grep -qF 'No locked files')
then
# ...
fi
또는
if smbstatus 2>&1 1>/dev/null | grep -qf 'No locked files'
then
# ...
fi