unix shell

O interpretador de comandos dos sistemas operacionais Unix e Unix-like é a interface tradicional para operar o computador. Por meio de comandos, o usuário direciona o sistema para tarefas específicas.

O interpretador, conhecido como shell, normalmente suporta uma linguagem de script para que os comandos possam ser executados de maneira sequencial, permitindo automatizar tarefas rotineiras.

Mas, internamente, o que faz o shell? Bem, as etapas básicas são as seguintes:

  1. imprime o prompt de comando: $ para usuário ou # para root
  2. lê a linha digitada pelo usuário
  3. remove CRLF (\r\n) e depois separa a linha em strings, onde houver espaço
  4. fork(): duplica o conteúdo do próprio processo (parent) no sistema, criando um processo filho (child)
    • no child: execvp() executa o comando digtado – tipo ls -l
    • no parent: wait(NULL) aguarda o processo filho terminar

Embora os shells mais avançados como bash e csh possuam uma enorme quantidade de funções, tais como as da biblioteca readline, um shell apenas com as etapas mencionadas acima funciona perfeitamente.

Aqui está o exemplo:

/* 20090118 - AF */
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/wait.h>

static char *stripcrlf(char *line)
{
    char *p;
    for(p = line; *p; p++)
        if(*p == '\r' || *p == '\n') { *p = '\0'; break; }
    return line;
}

static void split(char *line, char **args)
{
    while(*line) {
        while(*line && *line == ' ') *line++ = '\0';
        *args++ = line;
        while(*line && *line != ' ') line++;
    }
}

int main()
{
    char *p, line[4096], *args[sizeof line/2];

    for(;;) {
        fprintf(stdout, getuid() ? "$ " : "# ");
        fflush(stdout);

        memset(line, 0, sizeof line);
        if(!fgets(line, sizeof line, stdin)) {
            fprintf(stdout, "\n");
            clearerr(stdin);
            continue;
        }

        p = stripcrlf(line);
        if(*p) split(p, args);
        else continue;

        if(!fork()) {
            if(execvp(args[0], args) == -1) perror("exec");
        } else wait(NULL);
    }
    return 0;
}

NOTA: a imagem no topo foi criada por Paul Bourke em 1989, encontrada neste site.

Anúncios

usando find para encontrar arquivos antigos

A maioria dos administradores de sistemas UNIX provavelmente já fez isso. Se não, ainda vai precisar.
É uma coisa simples, que todo mundo sabe que é possível, mas sempre esquece. Eu mesmo esqueço e por isso vou postar aqui, ai fica mais fácil quando esquecer denovo.

find /tmp -iname \*.jpg -atime +1 -print

Esse comando mostra os arquivos com extensão JPG (case insensitive, -iname) no diretório /tmp, que tenham sido acessados a mais de 1 dia – por isso +N. Pode-se usar -N para datas menores que N: se fosse -1, encontraria arquivos que foram acessados a menos de 1 dia. Quando não há sinal, encontra com exatidão: se fosse -atime 2, encontraria arquivos que foram acessados a exatamente 2 dias.

No manual find(1) há a descrição de todas opções, como -atime, -amin e -anewer. Também, das variantes com -ctime e -mtime (-cmin, etc).

Só pra lembrar:

  • Estes dados são armazenados na struct stat, descrita no manual stat(2)
  • o atime é atualizado quando há algum tipo de acesso no arquivo – com execve(2), read(2), etc.
  • o mtime é atualizado quando há modificação no arquivo – quando novos dados são escritos nele, truncate(2), write(2). No caso de diretórios, o mtime do diretório é atualizado quando arquivos são criados ou removidos nele.
  • o ctime é atualizado quando há escrita no arquivo, ou quando suas permissões são alteradas – write(2), chmod(2), chown(2), etc.

unix toolbox

Recebi numa lista de email um documento bem abrangente sobre os básicos do Unix Toolbox. O documento menciona diversos comandos pra linux, freebsd e até windows. Nele, estão inclusos comandos e procedimentos de forma resumida e direta para: extrair informação do hardware (cpu, ram, pci, usb), processos, sistemas de arquivos, rede, etc.

Embora esteja em inglês, vale a pena ler ou mesmo usar como guia quando necessário – e com certeza manter nos bookmarks. O link é este aqui: http://cb.vu/unixtoolbox.xhtml