스크립트에서 명령 출력을 읽는 방법

스크립트에서 명령 출력을 읽는 방법

저는 현재 Linux 스크립팅을 배우고 있는데 제가 할 수 있는 한 가지는 명령 출력을 변수에 할당하는 것입니다. 명령이 service httpd configtest반환되었으므로 Syntax is OK이렇게 작성했습니다.

#!/bin/bash

var=`service httpd configtest`
echo "Output is $var"

내가 읽은 바에 따르면 출력은 저장되었다 var가 다시 반향되어야 합니다. 그러나 스크립트를 실행할 때의 출력은 다음과 같습니다.

Syntax OK
Output is

내가 뭘 잘못했나요? 차이점이 있다면 CentOS 6.5를 사용하고 있습니다.

답변1

이를 실행하면 service httpd configtest실제로 다음 명령이 실행됩니다 apachectl configtest.

  ....
  apachectl=/usr/sbin/apachectl  
  ....
  graceful|help|configtest|fullstatus)
        $apachectl $@
        RETVAL=$?
        ;;
  ....

어떤 것을 만들어 strace:

$ strace -f -e trace=write apachectl configtest
Process 22999 attached (waiting for parent)
Process 22999 resumed (parent 22998 ready)
[pid 22999] write(1, "1024\n", 5)       = 5
Process 22999 detached
--- SIGCHLD (Child exited) @ 0 (0) ---
Process 23000 attached (waiting for parent)
Process 23000 resumed (parent 22998 ready)
Process 22998 suspended
[pid 23000] write(2, "Syntax OK\n", 10Syntax OK
) = 10
Process 22998 resumed
Process 23000 detached
--- SIGCHLD (Child exited) @ 0 (0) ---

보시다시피 출력이 Syntax OK기록되어 출력이 변수 stderr에 저장되지 않습니다 .var

stderr리디렉션을 통해 이 작업을 수행할 수 있습니다 stdout.

var=$(service httpd configtest 2>&1)

답변2

내 추측으로는 대신 service httpd configtest출력되는 것입니다 .stderrstdout

var=$(service httpd configtest 2>&1)
echo "Output is $var"

또는 변수 없이도 다음과 같이 할 수 있습니다.

echo -n "Output is "
service httpd configtest 2>&1

echo 옵션은 출력이 같은 줄에 -n있도록 후행 줄 바꿈을 억제합니다 .service httpd configtest

`...`또한 $(...)백틱은 일부 문제를 일으킬 수 있고 일반적으로 더 이상 사용되지 않는 것으로 간주되므로 위에서 백틱( )을 전환했습니다 . 바라보다$(stuff)와 `stuff`의 차이점은 무엇입니까?더 많은 정보를 알고 싶습니다.

"무엇" stdout, stderr"무엇" 및 " 2>&1무엇"이 수행하는지에 대한 자세한 내용은 Wikipedia 페이지를 확인하세요.표준 스트림그리고리디렉션.

답변3

이 변수 var에는 다음이 포함됩니다.ANSI 이스케이프 코드이로 인해 한 줄 위로 이동하게 됩니다.

다음 예제를 사용하여 출력을 재현할 수 있습니다.

var=$'\033[FSyntax OK\n'
echo "Output is $var"

그러면 다음이 생성됩니다.

Syntax OK
Output is

첫 번째 줄은 위의 두 줄을 포함하여 스크립트의 프롬프트를 덮어씁니다.

관련 정보