Peczenyj's Blog

Just Another /Perl|Ruby|C++|Java|Python|JavaScript|Flash|Bash/ Hacker

Um Caracter Inconveniente

Não é incomum passar pelo problema de tentar apagar um arquivo cujo nome começa com o caracter ‘-‘, como no exemplo abaixo:

$ rm -arquivo.txt
rm: invalid option -- a


Não adianta proteger a string pois não é o Shell que atrapalha a ação, e sim o próprio programa que reconhece o símbolo - de uma forma diferente. O programa rm aceita, alem de uma lista de arquivos para apagar, uma série de opções que modificam o seu funcionamento. As mais comuns são:

  -f  ignore nonexistent files, never prompt
-i prompt before any removal
-r remove the contents of directories recursively
-v explain what is being done


As opções normalmente pode ser colocadas em qualquer lugar da lista de parâmetros.

$ rm -v a.out
removed `a.out'

$ rm a.out -v
removed `a.out'


Quem avalia os parâmetros normalmente é uma função chamada getopt (presente em várias linguagens, inclusive no Bash). Bom, vimos que o - é um caracter especial para o getopt, mas existe alguma forma de burlar isso?

Sim! O proprio getopt prove essa funcionalidade: o uso dos simbolos ‘–’. Eles interrompem a expansão de parâmetros e tudo o que vier depois desses dois caracteres será interpretado literalmente pelo programa.

Assim sendo:

$ rm -v -- -arquivo.txt
removed `-arquivo.txt'


Esta dica está no help do comando rm e vale para todos os programas que usem getopts.

Comments

La Batalema Pitonisto
É Tiago,

Nunca caí nessa do arquivo começado com sinal de menos, não por ser mais esperto que os outros, mas porque sou uma traça de manual. =)

Basta um man rm para resolver o problema (foi o que fiz na primeira vez em que me deparei com um arquivo desses).

Mas sabia que existe um livro que muitos chamam de «A Bíblia Negra do Hacker» (creio que a alcunha correta seria «o livreto negro de bolso do lammer»)? Esse livro apresenta a questão do «ataque» (ó! pretenção) onde o «atacante» (uf!) usa :> para criar arquivos começando com sinal de menos, cuja única forma de resolver o problema, segundo o livro, é mover todos os demais arquivos para outro diretório e apagar (argh!) o diretório onde estão os arquivos maliciosos.

É de se escangalhar de rir… um verdadeiro livreto de piadas sujas.

[]’s
Cacilhas

Transformers

Estréia em Julho:



More Than Meet The Eyes!

Ola Mundo!

Quando aprendemos uma nova linguagem de programação, normalmente o primeiro exemplo é o famoso “Hello World!”, ou seja, um pequeno código que imprime uma mensagem na tela do computador.

Em C, ele seria assim:

/* Um comentário */
#include <stdio.h>

int main ()
{
puts ("Hello world!");
return 0;
}


As vezes o puts é substituido pelo multifacetado printf no exemplo, mas o efeito é o mesmo. Vejamos como seria em Java.

/* Comentarios, igual ao C */
package Hello;

public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello world");
}
}


As diferenças são várias, apesar da estrutura ser semelhante. Em C nós temos funções parametrizadas, enquanto em Java nós temos objetos (System.out) e métodos (println).

Por fim, vamos ver um exemplo em Shell Script

#!/bin/bash
# comentario
echo "Hello World!"


Diferente de uma linguagem de programação, aqui o interpretador de comandos (normalmente) chama um programa capaz de escrever mensagens para o usuario. Ou seja, alguem ja escreveu um “Hello World!” genérico o suficiente para nós.

Cada linguagem possui um propósito. Enquanto vc projeta sistemas operacionais e drivers em C, Java ocupa uma área no desenvolvimento de grandes sistemas corporativos enquanto o shell está presente na administração de determinadas tarefas de um servidor (normalmente rodando algum sabor de *nix).

Não basta comparar um hello world, pois é preciso ver muito além da sintaxe e recursos da linguagem, mas normalmente se começa por ele.

Outros exemplos podem ser encontrados aqui.

Abraços