Pular para o conteúdo principal

O programa rodando

Com o a_maze_ing.py completo (página anterior), o programa inteiro funciona. Várias páginas desta parte e da parte 13 mostraram comandos que só podiam rodar agora. Esta página roda cada um deles e mostra a saída.

Todos os comandos rodam na raiz do projeto, com o Python do ambiente virtual: .venv/bin/python a_maze_ing.py <arquivo> é o mesmo que o python3 a_maze_ing.py config.txt do enunciado. Para o config.txt, make run faz o mesmo. Os arquivos que um exemplo cria são apagados no fim do próprio exemplo; o maze.txt, gravado a cada execução com o config.txt, fica, porque o .gitignore o deixa fora do repositório.

Responder ao menu por um pipe​

O printf escreve as respostas, e o | as entrega ao programa como se alguém as digitasse (página 1). Com 2 e 4, o programa desenha, mostra o caminho, desenha de novo e sai; o grep -c conta as linhas da saída que contêm o título do menu:

printf '2\n4\n' | .venv/bin/python a_maze_ing.py config.txt | grep -c 'A-Maze-ing'
2

O menu aparece duas vezes: depois do primeiro desenho e depois do desenho com o caminho.

Com uma resposta inválida, 9, e depois 4, as últimas linhas da saída são as da página 3. O tail -n 7 guarda só as sete últimas linhas, e o cat -e marca com $ o fim de cada uma:

printf '9\n4\n' | .venv/bin/python a_maze_ing.py config.txt | tail -n 7 | cat -e
=== A-Maze-ing ===$
1. Re-generate a new maze$
2. Show / Hide the shortest path$
3. Rotate the wall colours$
4. Quit$
Choice? (1-4): Invalid choice$
Choice? (1-4):

A última linha não tem $: a resposta 4 sai sem imprimir a quebra de linha.

O aviso do "42"​

O pequeno.txt descreve um labirinto 5x5, pequeno demais para o "42" (página 4). O > /dev/null descarta a saída normal, e só a saída de erros aparece:

printf 'WIDTH=5\nHEIGHT=5\nENTRY=0,0\nEXIT=4,4\nOUTPUT_FILE=pequeno_maze.txt\nPERFECT=False\n' > pequeno.txt
printf '2\n4\n' | .venv/bin/python a_maze_ing.py pequeno.txt > /dev/null
echo "exit=$?"
rm pequeno.txt pequeno_maze.txt
Error: maze too small for the "42" pattern
Error: maze too small for the "42" pattern
exit=0

Um aviso por desenho, e o código continua 0: o labirinto sem o "42" é válido.

A linha de comando​

Sem argumento e com argumentos demais (página 5):

.venv/bin/python a_maze_ing.py; echo "exit=$?"
.venv/bin/python a_maze_ing.py config.txt outro.txt; echo "exit=$?"
Usage: python3 a_maze_ing.py <config_file>
exit=1
Usage: python3 a_maze_ing.py <config_file>
exit=1

Os erros conhecidos​

Um arquivo de configuração que não existe (página 7):

.venv/bin/python a_maze_ing.py nao_existe.txt; echo "exit=$?"
Error: configuration file not found: nao_existe.txt
exit=1

Um arquivo de saída que não pode ser gravado (página 8). Os comandos criam a pasta trancado/ sem permissão de escrita e uma cópia do config.txt com OUTPUT_FILE=trancado/maze.txt, rodam o programa e apagam tudo. O sed (um programa de terminal que edita texto linha a linha) copia o config.txt trocando a linha que começa com OUTPUT_FILE=:

  • a instrução s|A|B| quer dizer "substitua o texto A pelo texto B" em cada linha. Aqui A é ^OUTPUT_FILE=.* e B é OUTPUT_FILE=trancado/maze.txt;
  • o ^ marca o começo da linha, e o .* quer dizer "qualquer coisa até o fim dela": A pega a linha OUTPUT_FILE= inteira, seja qual for o valor;
  • o separador mais comum é a barra (s/A/B/), mas qualquer caractere serve. Aqui é a barra vertical |, porque o texto B já tem uma barra (trancado/maze.txt), que o sed confundiria com o separador;
  • o > grava o resultado em trancado_config.txt; o config.txt não muda.
mkdir trancado
chmod 555 trancado
sed 's|^OUTPUT_FILE=.*|OUTPUT_FILE=trancado/maze.txt|' config.txt > trancado_config.txt
printf '4\n' | .venv/bin/python a_maze_ing.py trancado_config.txt; echo "exit=$?"
chmod 755 trancado
rm -r trancado trancado_config.txt
Error: cannot write output file 'trancado/maze.txt': Permission denied
exit=1

Aqui a falha acontece já na primeira geração, antes do primeiro desenho; numa regeneração pela opção 1, a mensagem e o código seriam os mesmos.

O desenho num arquivo​

O comando da parte 13: o > manda o desenho e o menu para um arquivo, com as sequências de cor junto. cat desenho_terminal.txt mostra o desenho colorido, igual ao do terminal; aqui o tail -n 6 mostra só o fim do arquivo:

printf '4\n' | .venv/bin/python a_maze_ing.py config.txt > desenho_terminal.txt
tail -n 6 desenho_terminal.txt | cat -e
rm desenho_terminal.txt
=== A-Maze-ing ===$
1. Re-generate a new maze$
2. Show / Hide the shortest path$
3. Rotate the wall colours$
4. Quit$
Choice? (1-4):