Perché non esiste alcun comando shell per creare file?


27

Attenzione prego:

Io non chiedo come fare un file dalla riga di comando!


Sto usando touchper fare file da anni senza prestare attenzione al fatto che il suo scopo principale è qualcos'altro. Se si desidera creare un file dalla riga di comando ci sono così tante possibilità:

touch foo.bar
> foo.bar
cat > foo.bar
echo -n > foo.bar
printf '' > foo.bar

E sono sicuro che ce ne sono altri.

Ma il fatto è che nessuno dei comandi sopra è in realtà progettato per la creazione di file. Ad esempio, man touchsuggerisce che questo comando serve per modificare i timestamp dei file. Perché un sistema operativo completo come Unix (o Linux) non ha un comando progettato esclusivamente per la creazione di file?


35
Perché dovresti ingombrare il sistema per aggiungere un comando per fare qualcosa che può essere fatto in una dozzina di modi con strumenti già esistenti?
Michael Kohne,

4
Perché non esiste alcun comando per leggere i file da / su stream / stdin / out? Ognuno usa il comando destinato alla catconfigurazione!
SF.

2
@MichaelKohne, vedo il tuo punto, con tutto il rispetto, ho un problema. Con questo approccio ci sono molti comandi che stanno solo ingombrando il sistema. Perché usare morequando lessfa più di quello che morefai !? O dire ls. Anche se sono a conoscenza di problemi di compatibilità.
Pouya,

9
moreprecede la creazione di less. lessè stato creato appositamente per ovviare alle carenze di more. moreesiste ancora per motivi di compatibilità con le versioni precedenti. dire lssono, per la maggior parte delle intenzioni e degli scopi, lo stesso eseguibile - differiscono solo per una manciata di byte. Un nuovo strumento destinato in modo specifico per la creazione di file farebbe a meno di strumenti esistenti, e come tale sarebbe una regressione, non un miglioramento, come nel caso del lessvs more.
lanzz,

1
Inoltre, dobbiamo esaminare l'eredità, Unix è stata creata quando ogni byte è stato contato. Perché creare un'utilità per un'attività che è possibile eseguire con un'utilità già esistente?
Thomas,

Risposte:


38

Direi perché non è quasi mai necessario creare un file vuoto che non riempirai immediatamente di contenuto sulla riga di comando o negli script di shell.

Non è assolutamente utile creare prima un file e quindi utilizzare il reindirizzamento I / O per scrivere sul file se è possibile farlo in un solo passaggio.

In quei casi in cui vuoi davvero creare un file vuoto e lasciarlo, direi che > "${file}"non potrebbe essere più breve ed elegante.

TL; DR : non esiste perché la creazione di file vuoti il ​​più delle volte non serve, e in alcuni casi ci sono già una miriade di opzioni disponibili per raggiungere questo obiettivo.

Per contro, l'utilizzo touchfunziona solo se il file non esiste mentre le opzioni che utilizzano il reindirizzamento tronceranno sempre il file, anche se esiste (quindi tecnicamente, tali soluzioni non sono identiche). > fooè il metodo preferito poiché salva un forke echo -ndovrebbe essere evitato in generale poiché è altamente insostenibile.


1
Ho trovato il tuo punto di vista sulla creazione del file e quindi sull'utilizzo degli strumenti I / O, molto solido. Grazie.
Pouya,

1
@FaheemMitha Sì ( >>). Mi riferivo agli esempi forniti da OP utilizzando >. L'aggiunta sarebbe del tutto inutile se quello che stai cercando è la creazione di file (o NOOP se esistono).
Adrian Frühwirth,

1
Non dimenticare che noclobbernon deve essere impostato in modo da >sovrascrivere un file esistente.
Ouki,

1
@Ouki AFAIK, impostazione che non è un comportamento predefinito e si potrebbe dimenticare che è impostato su un sistema e non su un altro, potenzialmente causando problemi nello stesso modo in cui creare un alias rm='rm -i'invece di alias rmi='rm -i'è una cattiva idea.
Agi Hammerthief,

1
@mikeserv, solo > .filesu una riga di comando, lo farà perfettamente anche senza :.
Charles Duffy,

16

La risposta di Adrian Frühwirth è corretta. Volevo solo aggiungere che v'è in realtà un comando specificamente scritta per creare file: mktemp.

NAME
       mktemp - create a temporary file or directory

SYNOPSIS
       mktemp [OPTION]... [TEMPLATE]

DESCRIPTION
       Create a temporary file or directory, safely, and print its name.  TEM
       PLATE must contain at least 3 consecutive 'X's in last  component.   If
       TEMPLATE is not specified, use tmp.XXXXXXXXXX, and --tmpdir is implied.
       Files are created u+rw, and directories  u+rwx,  minus  umask  restric
       tions.

Certo, mktempil compito non è quello di creare un file con un nome specifico, ma semplicemente di creare un file . Tuttavia, come ti è già stato detto, ci sono molti modi più efficienti ed eleganti per creare file con un determinato nome che fornire un comando per questo sarebbe inutile.

Detto questo, hai anche truncateed fallocateentrambi i cui scopi essenziali è creare file. Hanno semplicemente un approccio più sofisticato. Non ci sarà mai un semplice programma che faccia quello che > filefa poiché non c'è modo di farlo meglio di > file.


11

La maggior parte degli strumenti shell di base non è stata progettata per uno scopo molto specifico. La maggior parte degli strumenti di shell di base sono progettati solo per interagire con gli altri per raggiungere il tuo scopo. O forse si dovrebbe dire che la maggior parte degli strumenti fa solo una cosa molto semplice, indipendentemente da come potrebbero essere combinati per raggiungere un obiettivo.

: >./file

Questo crea un file vuoto. O tronca un file esistente come vuoi. Puoi:

set -o noclobber

per evitare qualsiasi possibilità di quest'ultimo caso a meno che tu:

: >|./file

Puoi ottenere un comportamento simile a touchcon:

: >>./file
: >>|./file

Tranne che :non aggiornerà il modtime di un file perché non è modificato.

DEMO

mkdir test ; cd $_
touch touch.file 
: >null.file
echo >echo.file
ls -l

PRODUZIONE

-rw-r--r-- 1 mikeserv mikeserv 1 Apr 10 14:52 echo.file
-rw-r--r-- 1 mikeserv mikeserv 0 Apr 10 14:52 null.file
-rw-r--r-- 1 mikeserv mikeserv 0 Apr 10 14:52 touch.file

NON TOCCARE

: >>|./echo.file
ls -l 

PRODUZIONE

-rw-r--r-- 1 mikeserv mikeserv 1 Apr 10 14:52 echo.file
-rw-r--r-- 1 mikeserv mikeserv 0 Apr 10 14:52 null.file
-rw-r--r-- 1 mikeserv mikeserv 0 Apr 10 14:52 touch.file

Per impostazione predefinita, l'eco si aggiunge \nalla fine della riga. Prova echo -n >echo-n.file(size = 0) e echo -e >echo-e.file(size = 1)
Thomas

@Thomas 'Una stringa da scrivere nell'output standard. Se il primo operando è -n o se uno degli operandi contiene un carattere barra rovesciata ('\'), i risultati sono definiti dall'implementazione. Sui sistemi conformi a XSI, se il primo operando è -n, deve essere trattato come una stringa, non come un'opzione. Le seguenti sequenze di caratteri devono essere riconosciute su sistemi conformi a XSI all'interno di uno qualsiasi degli argomenti ... ' pubs.opengroup.org/onlinepubs/009604599/utilities/echo.html
mikeserv

Abbastanza giusto, grazie per il link, e il mio commento non è comunque il punto
Thomas

2
Sì davvero e scusa, volevo dire che il mio commento mancava comunque il punto della tua risposta, mi dispiace per quello.
Thomas,

1
Un'illustrazione della tendenza Unix a generalizzare è il fatto che viene chiamato il comando per visualizzare il contenuto di un file cat. Perché avere un comando per visualizzare un file, quando è possibile eseguire un comando per concatenare più file sullo standard output?
200_successo

1

L'utilità installè in realtà progettata per la creazione di file! Puoi passare il contenuto del file via /dev/stdin(nella maggior parte dei casi, tuttavia, sulla maggior parte dei gusti di Linux, questo richiede che /procsia montato) o fornire un altro file sorgente. È possibile impostare la proprietà e le autorizzazioni.

echo "New file" | install -o 0644 -m 452452 -g dumbass /dev/stdin /var/www/index.html

come esempio sciocco.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.