Tilde (~) all'interno della directory di lavoro unix


22

Quindi, sto lavorando in un ambiente UNIX e ho notato che all'interno della mia directory di lavoro, che si trova a miglia di distanza dalla mia casa UNIX, c'è un ~.

Ora, una volta in passato, l'ho fatto rm -rf ~dalla mia directory di lavoro e ho finito per cancellare completamente la mia directory home e ho dovuto coinvolgere l'IT.

Non voglio farlo di nuovo. Allo stesso tempo, voglio sapere

  1. Perché viene ~creato nella mia directory di lavoro? È un vetrino difettoso durante il salvataggio ( :w!ma cosa succede è :w~? !!)

  2. Prima di effettuare il check-in, c'è uno script che cerca file o cartelle extra che p4 non è a conoscenza, quindi questo ~potrebbe causare un problema. Quindi, come posso rimuovere il ~dalla mia directory di lavoro e allo stesso tempo non cancellare la mia casa?

Ho un comando di backup chiamato delche uso al posto di rm -rf. Mette semplicemente le cose in una posizione temporanea. Potrei usarlo e sbarazzarmi di ~. Ma sono più interessato a sapere perché questo accade e come posso rimuoverlo?


Normalmente, la shell sostituisce ~ all'inizio di un percorso con la directory home. Utilizzare il percorso completo /home/yourUserName/~per accedere alla directory chiamata ~.
jofel,

E ~ altroutente / file può essere usato per fare riferimento alle home directory di altri utenti, per completezza.
godlygeek,

Sembra uno scherzo!
Xolve,

Risposte:


36

O citalo:

rm -i '~'
rm -i "~"
rm -i \~

O fai riferimento a un percorso, anziché solo un nome di base:

rm -i ./~
rm -i /path/to/~

Nota che, nonostante sia un nome di singolo personaggio dall'aspetto divertente, questo non è concettualmente diverso da se avessi creato un file chiamato SOME$PATHfacendo

touch 'SOME$PATH'

E ho provato a rimuoverlo facendo:

rm -i SOME$PATH

( Attenzione: la variabile SOME$PATH non è citata per il bene dell'esempio qui. Normalmente sarebbe racchiusa tra virgolette 'SOME$PATH' )

In entrambi i casi, la shell sta espandendo il nome assegnato e devi evitarlo.

Inoltre: non utilizzare rm -rfper rimuovere un file! Lo scopo rm -rè quello di dire rmche è OK rimuovere le directory. Se non si desidera rimuovere accidentalmente intere directory durante il tentativo di rimuovere i file, non passare abitualmente -r!


12
Ho appena provato questo. :w~in vim ha creato un file chiamato ~. rm ~restituito cannot remove /home/seth it is a directory. rm "~"ha rimosso il file . Solo per sottolineare non passare -rfautomaticamente .
Seth,

4
+1 per aver raccomandato di omettere le opzioni violente di default. Questo è simile al fare kill -9di default, che ho visto.
Celada,

Vedo che l'esempio rm -i $FOOintenzionalmente non cita la variabile per il bene dell'esempio, ma comunque: mostrare un esempio di shell che coinvolge rme una variabile non quotata come argomento è MOLTO MALE , uh, scusate, indipendentemente dal contesto. Sono sicuro che si può persino dimostrare :) Aggiungerò qualche nota, ma forse potresti cambiare un po 'l'esempio?
Volker Siegel,

@VolkerSiegel, Punto preso - Ho preso parte alla tua modifica, ma la nota a piè di pagina sembrava un po 'troppo pesante. Sono anche passato a un nome di variabile ancora meno probabile che causi problemi: la maggior parte delle persone non ha un file nominato in SOME/bin:/usr/binnessun punto del proprio filesystem. :)
godlygeek,

Sì, sembra buono! (Stavo quasi per rispondere: Cosa? Pesante? Hai mai avuto un vero problema di quotazione nella tua vita?;) Solo un po 'disperato per la quantità di esempi di shell sbagliati là fuori, in generale ... Ehi, è difficile capire anche senza esempi sbagliati! )
Volker Siegel il

1

La tilde se usata da sola nel contesto di ls ~elencherà la tua home directory come ~ è una scorciatoia per la tua home directory. Se lo hai fatto ls ~brown, elencherai i contenuti della home directory di brown.

VIM, se non diversamente specificato, creerà una copia di backup di un file modificato: myFile myFile ~.

Questo comportamento è buono in quanto crea un backup ma se non lo desideri, aggiungi al tuo file .vimrc: non impostare alcun backup (con il quale ho appena effettuato l'accesso vi ~/.vimrc).

E ovviamente, come hanno detto altri, se hai un file chiamato ~ allora semplicemente scappa dal carattere come \ ~

me 217 % vi this      (saved as :w~)
me 218 % ls
this  ~
me 219 % cat \~
kfdkdfk
me 220 % \rm \~
me 221 % ls
this

0

Ciò potrebbe essere effettuato da errori di battitura. Se la tua TERM=xtermconfigurazione è simile alla mia, praticamente ogni tasto funzione sulla tastiera invierà sequenze di escape come ...

infocmp -1 | grep -n \~ | tail -n3
138:    kich1=\E[2~,
141:    knp=\E[6~,
142:    kpp=\E[5~,

Oltre la metà dell'output di infocmp -1contiene fughe di ~tilde sulla mia macchina - e non riesco a capire cosa fanno la maggior parte di loro. So che zshalmeno in realtà mangia la parte sfuggita della corda nella maggior parte dei casi - e lascia solo la ~tilde .

Ad esempio, digitando echoquindi <space>quindi F6e <return>stampa ...

/home/mikeserv

La sequenza di escape effettiva inviata è ...

kf6=\E[17~

È interessante notare che ci sono altre sequenze di escape che contengono >caratteri.

infocmp -1 | grep \>
is2=\E[!p\E[?3;4l\E[4l\E>,
rmkx=\E[?1l\E>,
rs2=\E[!p\E[?3;4l\E[4l\E>,

Questi sono gli escape comunemente usati: reimpostare e inizializzare le stringhe. Non è difficile immaginare che una tastiera rilasciata o un pulsante di qualche tipo quando una shell interattiva è in attesa di input potrebbe causare il troncamento casuale dei ~file in tutto il file system. Almeno occasionalmente affiora sul mio.

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.