간단히 말해서:파이프된 명령 사이의 단계를 포함하여 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
맨 위에 있어요. 이는 실제로 실행되는 내용을 알려주기 때문에 도움이 되지만 파이프라인의 각 단계가 어떻게 작동하는지 이해하기에는 충분하지 않습니다. 실제로 도움이 되는 것은 입력 변환을 단계별로 살펴보는 것입니다. 이는 정보가 많기 때문에 일반적으로 수동으로 수행합니다.
- 사용법을 잊어버려서
tree --noreport -nFif -I $TREE_IGNORE_PATTERN | awk '$0 !~ /\/$/ && $0 !~ /^\.$/' | tr -d '*' | awk '{print "" ; print "### " $0 ; print "```" ; system("cat " $0 ) ; print "" ; print "```" ; print "" }'
그냥 복사해두겠습니다. - 이것을 명령줄에 붙여넣습니다.
- 왜냐하면 다음과 같은 변수에 의존하기 때문입니다
$TREE_IGNORE_PATTERN
.- 이 변수의 확장된 값을 복사합니다.
- 명령줄에서 이 변수를 확장된 값으로 바꿉니다.
- 이제 명령은 다음과 같습니다.
tree --noreport -nFif -I 'node_modules|package-lock.json|.gitignore|.git|dist' | ...
.
- enter명령줄에서 실행합니다 .3.3단계. 이는 내 기록에 명령을 저장하여 를 눌러 다시 돌아갈 수 있도록 하기 위한 것입니다 up.
- 나는 를 누른다 up.
- 모든 파이프 명령을 제거하고
tree --noreport -nFif -I 'node_modules|package-lock.json|.gitignore|.git|dist'
. - 출력을 이해하기 위해 실행했습니다.
- 나는 를 누른다 up.
- 모든 파이프 명령을 제거하여 명령줄을 편집했습니다.하지만 1, 날 떠나요
tree --noreport -nFif -I 'node_modules|package-lock.json|.gitignore|.git|dist' | awk '$0 !~ /\/$/ && $0 !~ /^\.$/'
. - 출력을 이해하기 위해 실행했습니다.
- 달릴 때까지 반복해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 "" }'