smbstatus의 결과를 쉘 스크립트 변수로 가져오는 방법

smbstatus의 결과를 쉘 스크립트 변수로 가져오는 방법

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

나는 당신이 차이점을 본 것 같다: smbstatusprint 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

관련 정보