(set -x) 모드의 Bash 스크립트는 "cat" 명령의 기능을 표시하지 않습니다. (내용)

(set -x) 모드의 Bash 스크립트는 "cat" 명령의 기능을 표시하지 않습니다. (내용)

이 bash 스크립트에서는 .. 그냥 표시됩니다 ..

    +cat

실행될 때.

#!/bin/bash
set -x
cat > /test << "EOF"
a
b
c
d
EOF

하지만 나는 그것이 무엇인지 보여주고 싶습니다. 포함하다

a
b
c
d

파일에 추가됩니다.

답변1

set -v대신 사용해 보세요set -x

답변2

set -x이는 일반적인 리디렉션의 요소가 아닌 디스플레이 확장의 평가 로 인해 발생합니다 .

LC_ALL=C man set |
sed -n '/^ *-x/,/^$/p'

   -x    The  shell  shall  write  to standard error a
         trace for each command after it  expands  the
         command  and  before  it  executes  it. It is
         unspecified whether the  command  that  turns
         tracing off is traced.

~에서POSIX 사양

리디렉션 연산자 <<<<-둘 다 다음과 같은 쉘 입력 파일에 포함된 라인 리디렉션을 허용합니다.여기 문서, 명령 입력에.

cat쉘이 아닌 입력을 받는 것은 바로 그것입니다 . 그래서 없다확장실행 전에 보고하도록 합니다. 그리고 일단 해당 입력이 전달되면 실제로 보고할 데이터가 없습니다.

다른 곳에서 제안한 것처럼 set -v작동하지만 -x작동하지 않는 이유는 다음과 같습니다.

LC_ALL=C man set |
sed -n '/^ *-v/,/^$/p'

   -v    The shell shall write its input  to  standard
         error as it is read.

이 경우 stderr확장 여부에 관계없이 리디렉션하기 전에 읽은 대로 입력을 복사합니다.

답변3

셸에는 이 작업을 지원하는 기능이 없습니다. 너는 이 목표를 달성할 수 있다특정한결과

tee /test << "EOF"
a
b
c
d
EOF

그러나 이것이 쉘 스크립트에서 수행할 수 있는 모든 작업에 완전히 적용되는 것은 아닙니다.

screen와 같은 프로그램을 살펴보고 싶을 수도 있습니다 Expect.

관련 정보