É verdade que existem diversas formas de se fazer a mesma coisa no
Linux, isso é fato. O negócio complica quando a pergunta é "qual a melhor forma?", ou "qual a forma mais eficaz?". Bom, em certas situações, existe sim uma maneira correta, e também existem métodos não ortodoxo (gambiarras).
Vou falar (escrever) um pouco sobre a
forma correta de se criar arquivos no GNU/Linux. Eu também sou iniciante no Linux e pretendo me aprofundar no sistema. Acredito que você também pretenda se aprofundar nele, seja pelo mercado, seja pela cultura ou seja pela comunidade. De qualquer modo, estamos juntos nesse barco e acredito que essa dica tenha alguma importância. Sendo assim vale a pena compartilha-la.
Quando estamos engatinhando no sistema GNU/Linux, dando os primeiros passo (ou, os primeiros comandos) precisamos entender exatamente o que cada comando faz, um comando é como um passo: basta um passo em falso para que você se desequilibre e caia. Então é preciso ter certeza que demos o passo correto. Se seu objetivo for simplesmente andar (sem se preocupar com a maneira correta ou mais segura de andar), você irá andar. Mesmo que você ande de forma desajeitada, insegura ou até mesmo desastrosa (muito eu), parabéns você andou! Agora ande da forma correta e segura.
Não sei quem você é, mas posso supor que um dos seus primeiros comandos no GNU/Linux foi o... ls (list, para listar o conteúdo do diretório atual)? Ou quem sabe o cd/chdir (change directory, trocar de diretório), ou o mkdir (make directory, criar um diretório), rmdir(remove directory, remove um diretório vazio), rm(remove, remove um diretório ou arquivo) e o touch (cria um arquivo vazio). Acho que de tanto chute eu acertei qual foi um sei primeiro comando kkk (digita aí qual foi o seu primeiro comando xD).
Bom, todos os comandos citados anteriormente executam fielmente a sua função, exceto um, o touch - cria um arquivo vazio. O comando touch não cria arquivo coisa nenhuma, ele altera o tempo de acesso do arquivo.
Vamos analisar alguns casos - quando você for treinar certifique-se de estar logado em root ou em um usuário com permissões de leitura e gravação em disco.
touch arquivo1
O que esse comando fez? Ele criou um arquivo?
Sim (ls para ver o arquivo), não só isso, ele criou um arquivo alterando o tempo de acesso atual (data e hora atual), mas que para tudo isso tivesse sido feito, primeiro o comando guardou em disco a data e a hora atual, depois tentou alterar essas informações no arquivo arquivo1, como esse arquivo não existe ele simplesmente o criou (para não perder a viajem) em seguida fez as modificações.
Está errado criar arquivos com touch? Tecnicamente sim, levando em consideração todo esse trabalho que o sistema teve, houve uma grave perda de tempo. Tem como medir o tempo de execução do comando? Sim! :), veja a baixo um exemplo.
Execute:
time touch arquivo2
A saída na minha máquina foi a seguinte:
real 0m0.031s
user 0m0.001s
sys 0m0.024s
Podemos ver que o tempo gasto foi de 0.031 segundo. Muito rápido, certo? Errado. Ele levou um tempão.
Então qual a forma correta?
Quando pedimos para o sistema simplesmente guardar nada no arquivo tal, ele o execute sem pestanejar, afinal essa é a sua verdadeira função!
Execute o comando abaixo:
>arquivo2
Observe que foi usado o ">"(maior que) seguido de um argumento, o nome do arquivo. Tá ... Mas e daí? Ele também cria um arquivo, da mesma forma do touch. Da mesma forma eu garanto que não. O comando touch executa algumas outras instruções por baixos dos panos, o que o torna demorado... Já usando o ">"(maior que), vamos direto ao ponto: criar um arquivo vazio.
Vamos medir o tempo dele?
time >arquivo3
A saída na minha máquina foi a seguinte:
real 0m0.000s
user 0m0.000s
sys 0m0.000s
Ganhamos bastante tempo, não?
Também vemos que quando uma determinada coisa é usada exatamente da forma adequada, sua eficácia aumenta bastante. Sim existem várias formas de se criar um arquivo no GNU/Linux, e usando o touch é uma forma desajeitada e ineficaz de se fazer isso.
Talvez seu instrutor tenha noção de estar lhe repassando um conhecimento errôneo, talvez não.
Se essa dica te ajudou em alguma coisa, meu objetivo foi comprido. Sempre questione tudo, a curiosidade é a principal matéria prima da inovação.
E como é que se usa o touch? Se ficou curioso, pede nos comentários porque isso são páginas para o próximo capítulo! Muito obrigado pela atenção e valeu.
Olá,
Antes de mais nada, parabéns pelo modelo mental de sempre questionar. Entretanto...
Como já dito pelos colegas @elgio e @lcavalheiro, esta dica está totalmente errada.
O redirecionamento do shell (bash, ou similar) não é medido pelo time, até porque o argumento *não chega* ao time.
Um simples programa em C te mostra o que acontece:
/* redir.c
* gcc -o redir redir.c -Wall
*
* (C) 2017 - Enzo Ferber, <enzoferber@gmail.com>
*/
#include <stdio.h>
int main(int argc, char *argv[])
{
for(int i = 0; i < argc; i++)
printf("argv[%d]: %s\n", i, argv[i]);
return 0;
}
/* EoF */
Compile o programa e rode:
$ gcc -o redir redir.c -Wall
$ ./redir >out.txt
argv[0]: ./redir
$ ls
redir.c redir* out.txt
$
Como pode ver, o arquivo foi criado da mesma forma, mas o programa nunca viu o argumento ">out.txt". Antes de chamar o programa, o bash quebra toda a linha de comando em tokens, prepara os redirecionamento (pipes, etc), abre arquivos, e faz um monte de parafernalhas, depois faz um fork() (ou vários) e então chama execve() com os argumentos da linha de comando _válidos_. O seu "time >out.txt" na verdade é chamado, no final das contas, como "time" (sem argumentos).
EDIT: pode também verificar a veracidade do argumento chamando time com aspas. Isso vai passar o argumento diretamente para ele.
$ time ">out.txt"
This command was not found: >out.txt
real 0m0.001s
user 0m0.000s
sys 0m0.000s
Enzo Ferber
[]'s