Skip to main content

ZC4003 - echo with Escape Sequences

Descrição

echo com flags -e ou -E tem comportamento não-portável. Use printf para maior compatibilidade.

O Problema

O comando echo é um dos mais inconsistentes entre sistemas Unix:

  • Linux (GNU coreutils) - Suporta -e para interpretar escapes
  • macOS (BSD) - Interpreta escapes por padrão, -E para desabilitar
  • POSIX sh - Comportamento não especificado para escapes

Exemplo Problemático

#!/bin/zsh

# Pode funcionar em Linux mas não em macOS
echo -e "Line 1\nLine 2"

# Oposto - funciona em macOS mas não em Linux
echo "Line 1\nLine 2"

Solução Correta

Use printf - é POSIX e portátil:

#!/bin/zsh

# Funciona igual em todos os sistemas
printf "Line 1\nLine 2\n"

# Com variáveis - mais seguro
name="John"
printf "Hello, %s!\n" "$name"

# Múltiplos argumentos
printf "%s: %d\n" "Count" 42

Diferenças Entre echo e printf

Aspectoechoprintf
Portabilidade❌ Inconsistente✅ POSIX
EscapesDepende do sistemaSempre suporta
Novas linhasAdiciona automaticamenteRequer \n explícito
FormataçãoSimplesCompleta (como C)
--Alguns echo suportamNão aplica

Padrões Comuns com printf

#!/bin/zsh

# String simples
printf "Hello World\n"

# Com variável
user="Alice"
printf "User: %s\n" "$user"

# Número inteiro
count=5
printf "Count: %d\n" "$count"

# Tabulação
printf "Name\tAge\tCity\n"
printf "%s\t%d\t%s\n" "Alice" 30 "NYC"

# Sem nova linha (útil para prompts)
printf "Continue? "
read response

Quando echo é Aceitável

echo é seguro quando:

  • Não usa escapes (\n, \t, etc)
  • O argumento é uma string literal simples
  • O output não precisa ser portável
# Seguro - string simples sem escapes
echo "Hello World"
echo "Script completed"

Referências