¿Cuál es la diferencia en el uso de "archivo táctil" y "> archivo" al crear un nuevo archivo?

13

Soy nuevo en Linux. Cuando creo un nuevo archivo .gitignore en el directorio actual usando bash, descubrí que puedo hacer:

> .gitignore

o

touch .gitignore

Parece que hacen lo mismo. Cuando reviso el manual touch, dice cambio de marca de tiempo para el archivo actual, pero no hay manual para >. Entonces, ¿alguien puede explicar qué puede >hacer y hay alguna diferencia en el uso de estos dos comandos en este contexto? Gracias.

Steve Deng Zishi
fuente
1
Tengo curiosidad por saber dónde aprendió a usar '>' como generador de archivos sin conocer su uso previsto
Forresthopkinsa
1
Encontrará la redirección documentada en el manual de Bash. En la línea de comando, ingrese el comando man bash. Es un documento largo y tomará días o incluso semanas para entenderlo bien, pero vale la pena leerlo si quieres aprender Bash a fondo.
Paddy Landau

Respuestas:

21

>es el operador de redirección de shell. Consulte ¿Cuál es la diferencia entre ">" y ">>" en el comando de shell? y ¿ Cuándo debo usar <o <() o << y> o> ()? Se utiliza principalmente para redirigir la salida de un comando a un archivo. Si el archivo no existe, el shell lo crea. Si existe, el shell lo trunca (lo vacía). Simplemente > file, no hay ningún comando, por lo que el shell crea un archivo, pero no se le envía ningún resultado, por lo que el efecto neto es la creación de un archivo vacío o el vaciado de un archivo existente.

touches un comando externo que crea un archivo o actualiza la marca de tiempo, como ya sabe. Con touch, el contenido del archivo no se pierde, si existe, a diferencia de >.

El comportamiento de >depende del shell. En bash, dash y la mayoría de los shells, > foofuncionará como espera. En zsh, por defecto, > foofunciona como cat > foo: zsh espera a que escriba la entrada.

muru
fuente
10
El punto clave aquí es que no existe una diferencia práctica entre >> filey, touch filepero si fileno existe, existe una gran diferencia entre ambos y > file(en el sentido de que filese pierden los contenidos anteriores ). Eso, más el comportamiento inconsistente de zsh significa que touch filees el "más seguro" y, por lo tanto, debe memorizarse como La forma correcta de hacerlo.
Monty Harder
1

Aquí hay una comparación interesante:

$ cat redirect.sh touch.sh sed.sh awk.sh cp.sh truncate.sh tee.sh vi.sh
> redirect.txt
touch touch.txt
sed 'w sed.txt' /dev/null
awk 'BEGIN {printf > "awk.txt"}'
cp /dev/null cp.txt
truncate -s0 truncate.txt
tee tee.txt </dev/null
vi -esc 'wq vi.txt'

Resultado:

$ strace dash redirect.sh | wc -l
387

$ strace dash touch.sh | wc -l
667

$ strace dash sed.sh | wc -l
698

$ strace dash awk.sh | wc -l
714

$ strace dash cp.sh | wc -l
786

$ strace dash truncate.sh | wc -l
1004

$ strace dash tee.sh | wc -l
1103

$ strace dash vi.sh | wc -l
1472
Steven Penny
fuente
1
Si bien la comparación puede ser interesante, realmente no veo lo que quieres que vea aquí. ¿Puedes explicar para qué vas? Supongo que son diferentes maneras de escribir cosas en archivos, pero me resulta un poco confuso como este. Sin embargo, podría ser mi falta de café.
m00am
@ m00am lo que se muestra aquí es efectivamente 8 formas diferentes de crear un archivo. stracese supone que muestra las llamadas del sistema que se están ejecutando, y > file.txtse muestra que el método es la menor cantidad de llamadas del sistema ejecutadas, lo que realmente no es tan sorprendente: cuanto más compleja es una herramienta, más complejas son sus llamadas al sistema. Sin embargo, el problema con los ejemplos que se muestran es que straceescribe para stderrtransmitir de forma predeterminada, y en esta respuesta Steven usa la pipa para leer solo stderr, así que estoy un poco confundido sobre cómo contó las líneas usando la |pipa y no|&
Sergiy Kolodyazhnyy
Y en Ubuntu 16.04, usando |&, como menciona @Serg, obtengo recuentos de aproximadamente una quinta parte de los que están aquí ... excepto por el vicaso, donde obtengo aproximadamente el mismo valor
muru
WSL? Woah ... no pensé que WSL añadiría que muchas llamadas al sistema para lo que hace.
muru
@muru Cygwin - WSL aún no está listo stackoverflow.com/a/40370009
Steven Penny