test(skills): a suíte do instalador volta ao test:shell, e o caso do pipe não mede o SIGPIPE do cat

- package.json: instalar-guias.test.sh volta ao test:shell, junto com o
  colisao-de-migration.test.sh e o test:db:update que vieram da main.
- O caso 14 (--help pelo pipe) passava o script por `cat |`. Com pipefail, o
  cat leva SIGPIPE quando o bash sai do --help antes de ler tudo: num contêiner
  ubuntu:24.04 com pipe de 8 KB o caso dava 141 e 1 de 83 vermelho. Agora o
  script chega por redirecionamento da entrada padrão, com o mesmo $0 = bash.
  Medido: 83 de 83 no macOS e no contêiner.
- O cabeçalho do script dizia que o README ensina '| bash -s -- --help'; o
  README ensina '| bash'. A frase agora diz as duas formas.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Pessoa
2026-09-16 18:16:26 -03:00
co-authored by Claude Opus 5
parent aa98bfcbca
commit 6eff45e4ed
3 changed files with 7 additions and 5 deletions
+1 -1
View File
@@ -25,7 +25,7 @@
"test:unit": "vitest run",
"test:db": "bash scripts/test-db.sh",
"test:db:update": "bash scripts/test-update-com-dados.sh",
"test:shell": "bash tests/shell/update-guard.test.sh && bash tests/shell/dono-do-projeto.test.sh && bash tests/shell/scheduler-entrypoint.test.sh && bash tests/shell/cron-sem-crontab-previo.test.sh && bash tests/shell/owner-id-por-email.test.sh && bash tests/shell/deskcomm-contribuir.test.sh && bash tests/shell/colisao-de-migration.test.sh && bash hostgator-setup-kit/test-validators.sh",
"test:shell": "bash tests/shell/update-guard.test.sh && bash tests/shell/dono-do-projeto.test.sh && bash tests/shell/scheduler-entrypoint.test.sh && bash tests/shell/cron-sem-crontab-previo.test.sh && bash tests/shell/owner-id-por-email.test.sh && bash tests/shell/deskcomm-contribuir.test.sh && bash tests/shell/colisao-de-migration.test.sh && bash tests/shell/instalar-guias.test.sh && bash hostgator-setup-kit/test-validators.sh",
"test:invariants": "bash scripts/test-db.sh",
"lint:channels": "tsx scripts/lint-channels.ts",
"lint:role-rank": "tsx scripts/lint-role-rank.ts",
+3 -3
View File
@@ -1,7 +1,7 @@
#!/usr/bin/env bash
# O cabeçalho é o texto do --help, logo abaixo, e não um comentário: pelo caminho que o README
# ensina (`curl ... | bash -s -- --help`) o script chega pela entrada padrão, `$0` vale `bash` e
# não há arquivo de onde reler um comentário — o --help saía vazio, com exit 0.
# O cabeçalho é o texto do --help, logo abaixo, e não um comentário: pelo pipe que o README ensina
# (`curl ... | bash`; a ajuda é `curl ... | bash -s -- --help`) o script chega pela entrada padrão,
# `$0` vale `bash` e não há arquivo de onde reler um comentário — o --help saía vazio, com exit 0.
ajuda() {
cat <<'AJUDA'
instalar-guias.sh — deixa os guias do assistente (deskcomm-instalar, deskcomm-cliente-novo,
+3 -1
View File
@@ -211,7 +211,9 @@ echo "14. --help"
# arquivo saía vazio, com exit 0, justamente no caminho que o README ensina.
for modo in arquivo pipe; do
if [ "$modo" = arquivo ]; then saida="$(bash "$SCRIPT" --help 2>&1)"; code=$?
else saida="$(cat "$SCRIPT" | bash -s -- --help 2>&1)"; code=$?; fi
# Pela entrada padrão, sem `cat |`: com pipefail, o `cat` leva SIGPIPE quando o bash sai do --help
# antes de ler tudo, e o 141 dele mascarava o exit do script (medido num contêiner com pipe de 8 KB).
else saida="$(bash -s -- --help < "$SCRIPT" 2>&1)"; code=$?; fi
checa "[ $code = 0 ]" "($modo) sai com 0"
checa "grep -qF 'instalar-guias.sh — deixa os guias' <<<\"\$saida\"" "($modo) imprime a primeira linha do cabeçalho"
# O recorte por número de linha já comeu o fim do cabeçalho uma vez: o aviso do Claude Code é a