쉘 스크립트에서 파이프라인 체인의 각 단계 입력을 어떻게 인쇄합니까?

쉘 스크립트에서 파이프라인 체인의 각 단계 입력을 어떻게 인쇄합니까?

간단히 말해서:파이프된 명령 사이의 단계를 포함하여 bash 쉘 스크립트의 각 단계의 입력과 출력을 인쇄하는 방법이 있습니까?


이것이 관련이 있기를 바랍니다. 얼마 전에 스크립트를 작성했고 지금 편집하고 싶지만 더 이상 작동 방식을 이해할 수 없습니다. 이 스크립트를 사용하겠습니다.예를 들어:

#! /usr/bin/bash
set -ev

TREE_IGNORE_PATTERN='node_modules|package-lock.json|.gitignore|.git|dist'

echo '### Project Structure'
echo '```'
tree --noreport -F -a -I $TREE_IGNORE_PATTERN | tr -d '*'
echo '```'
echo ""

tree --noreport -nFif -I $TREE_IGNORE_PATTERN | awk '$0 !~ /\/$/ && $0 !~ /^\.$/' | tr -d '*' | awk '{print "" ; print "### " $0 ; print "```" ; system("cat " $0 ) ; print "" ; print "```" ; print "" }'

보시다시피 제가 set -v맨 위에 있어요. 이는 실제로 실행되는 내용을 알려주기 때문에 도움이 되지만 파이프라인의 각 단계가 어떻게 작동하는지 이해하기에는 충분하지 않습니다. 실제로 도움이 되는 것은 입력 변환을 단계별로 살펴보는 것입니다. 이는 정보가 많기 때문에 일반적으로 수동으로 수행합니다.

  1. 사용법을 잊어버려서 tree --noreport -nFif -I $TREE_IGNORE_PATTERN | awk '$0 !~ /\/$/ && $0 !~ /^\.$/' | tr -d '*' | awk '{print "" ; print "### " $0 ; print "```" ; system("cat " $0 ) ; print "" ; print "```" ; print "" }'그냥 복사해두겠습니다.
  2. 이것을 명령줄에 붙여넣습니다.
  3. 왜냐하면 다음과 같은 변수에 의존하기 때문입니다 $TREE_IGNORE_PATTERN.
    1. 이 변수의 확장된 값을 복사합니다.
    2. 명령줄에서 이 변수를 확장된 값으로 바꿉니다.
    3. 이제 명령은 다음과 같습니다. tree --noreport -nFif -I 'node_modules|package-lock.json|.gitignore|.git|dist' | ....
  4. enter명령줄에서 실행합니다 .3.3단계. 이는 내 기록에 명령을 저장하여 를 눌러 다시 돌아갈 수 있도록 하기 위한 것입니다 up.
  5. 나는 를 누른다 up.
  6. 모든 파이프 명령을 제거하고 tree --noreport -nFif -I 'node_modules|package-lock.json|.gitignore|.git|dist'.
  7. 출력을 이해하기 위해 실행했습니다.
  8. 나는 를 누른다 up.
  9. 모든 파이프 명령을 제거하여 명령줄을 편집했습니다.하지만 1, 날 떠나요 tree --noreport -nFif -I 'node_modules|package-lock.json|.gitignore|.git|dist' | awk '$0 !~ /\/$/ && $0 !~ /^\.$/'.
  10. 출력을 이해하기 위해 실행했습니다.
  11. 달릴 때까지 반복해3.3단계다시 명령줄에서. 이제 입력 변환의 모든 단계를 볼 수 있습니다.

손이 많이 가는 작업입니다. Bash 쉘 스크립트에서 파이프로 연결된 각 명령의 입력과 출력을 자동으로 볼 수 있는 방법이 있습니까?

대답이 "아니요, 하지만 zsh그렇습니다"라면 나는 그 대답을 받아들일 것입니다(그러나 받아들일 수 없는 경우에만 bash). 나는 또한 "아니요. 하지만 다음과 같이 코드를 작성/주석을 달면이것, 다시 방문하면 이해하기 더 쉬울 것입니다." 그러나 다시 말하지만, 이를 자동화할 수 있는 방법이 없는 경우에만 가능합니다 bash.zsh

답변1

난독화되지 않고 한 번에 하나의 파이프만 디버그해야 하는 경우 tee각 출력의 복사본을 파일로 파이프할 수 있습니다. 귀하의 경우:

tree --noreport -nFif -I $TREE_IGNORE_PATTERN | awk '$0 !~ /\/$/ && $0 !~ /^\.$/' | tr -d '*' | awk '{print "" ; print "### " $0 ; print "```" ; system("cat " $0 ) ; print "" ; print "```" ; print "" }'

될 것입니다:

tree --noreport -nFif -I $TREE_IGNORE_PATTERN | tee out1.log | awk '$0 !~ /\/$/ && $0 !~ /^\.$/' | tee out2.log | tr -d '*' | tee out3.log | awk '{print "" ; print "### " $0 ; print "```" ; system("cat " $0 ) ; print "" ; print "```" ; print "" }'

관련 정보